Archive : 2013-10

一年前に引っかかった話がドラフトとして眠っていたのでポスト。

 

attr_accessorで定義したsetterメソッドを同一クラス内から呼び出す時、期待するように値が更新されず困っていたのですが(以下参照)、

#!/usr/bin/env ruby

class InstanceVariableEval

  attr_accessor :val

  def initialize
    @val = "initial data"
  end

  def set_from_instance_method_through_accessor
    val = "set_from_instance_method_through_accessor"
  end

end


a = InstanceVariableEval.new

puts a.val
a.set_from_instance_method_through_accessor
puts a.val
a.val = "set_through_accessor"
puts a.val

## Following is the output. I can't understand why val is not updated by the method "set_from_instance_method_through_accessor".
# initial data
# initial data
# set_through_accessor

shigeyas先生に教えて頂き解決することが出来ました。

Rubyは、setter系のメソッドを同一クラス内から呼び出す場合(代入っぽい呼び出しを行う場合)、レシーバとしてselfを必要とするようです。selfを付けない場合、ローカル変数と区別がつかないために、ローカル変数の宣言兼代入として扱われてしまうのです。C#のプロパティだと、この問題に直面しにくいのは、C#では変数を使用するにあたって、宣言が必要なため、setter系のメソッドの呼び出しをローカル変数の宣言兼代入と誤認することがないためです。既に同名のローカル変数がその呼び出し元メソッド内で宣言されている場合は、thisをレシーバとして明示して呼び出しをする必要がある点は一緒ですね。

OCT
12

近況報告

Published:2013-10-12 15:48:45 UTC

また更新が空いてしまいましたが。。生きてます。
もう社会人二年目になってしまいました。時がたつのがはやいですね。。

さて、突然の報告ですが、今仕事でアメリカはユタ州に来ています。期間はこの8月から一年の予定。うちの会社の若手育成プログラムの一環で海外現地法人に武者修行の旅。会社に感謝です。英語には苦労させられていますが、今回は他に出向者の日本人上司もいるので、メンタル的には大分気楽にやれています。

生活も、会社の近くに一人暮らしをしていることもあり、大分楽が出来ています。異動前は片道70分かけて通勤していたのが、今は車で20分程に短縮されたので、時間的にも体力的にも余裕が出来てきました。そして、自炊を始めたのですが、2ヶ月たってもちゃんと続いています。ほら、アメリカの食事って美味しくないですし。。豚の薄切り肉が手に入らないとかは不便もありますが、とりあえずメインの米についてはこちらでもカリフォルニア産のコシヒカリが手に入るので、まぁ何とかやっています。

仕事。こちらに来て、取り組み内容を外に話しやすい仕事が増えたので、このブログでもそこから学んだことを取り上げられたらなと思います。異動前の仕事も、技術的なことに対して理解のある上司だったので、多分書こうとしたら許可は下りたと思うのですが、そのプロジェクトで使っている技術はRuby等慣れないものが多く、中々自分の中で試行錯誤している部分ばかりで、アウトプットに繋げられませんでした。今年こそは、しっかり技術的なことをBlogに書いていく習慣を身につけたいと思います。(なんか毎年同じことを書いている気もしますが。。)

そういうわけで、頑張っています。たまに日記的なことを書きつつ、技術的なことも書く感じで、このBlogも徐々に書いていきたいと思いますので、よろしくお願いします。