せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】パーフェクトRuby 学習感想文 ~第7章

それでは7章を読んでいきます。

(参考・経緯など)
パーフェクトRuby 学習感想文 ~はじめに


 

P276 実行結果が違うと思う

このコード、最後のrespond_to? メソッドはtrue じゃないかな?

class AttrClass
	def initialize
		@attr = "attr"
	end
	
	def add_reader(instance_val_name)
		eval <<-EOD
			def #{instance_val_name}
				@#{instance_val_name}
			end
		EOD
	end
	
	def add_writer(instance_val_name)
		eval <<-EOD
			def #{instance_val_name}=(val)
				@#{instance_val_name} = val
			end
		EOD
	end
end

attr_obj = AttrClass.new

p attr_obj.respond_to? "attr"  #=> false

attr_obj.add_reader "attr"

p attr_obj.respond_to? "attr"  #=> true

p attr_obj.attr

p attr_obj.respond_to? "attr"  #=> false

手元で確認してみました。やっぱりtrue になりました。

■hoge8.rb
上記のコード

■実行結果

false
true
"attr"
true

 

P276 例が分かりづらい

この記載コードは、インスタンス変数名とその値が同じなので、
ややこしくて少し理解が難しかったです。
下記のように作成する動的メソッド名を変更すると、理解しやすくなりました。

class AttrClass
	def initialize
		@attr = "attr"
	end
	
	def add_reader(instance_val_name)
		eval <<-EOD
			def #{instance_val_name}
				@#{instance_val_name}
			end
		EOD
	end
	
	def add_writer(instance_val_name)
		eval <<-EOD
			def #{instance_val_name}=(val)
				@#{instance_val_name} = val
			end
		EOD
	end
end

attr_obj = AttrClass.new

p attr_obj.respond_to? "hoge"  ←false

attr_obj.add_reader "hoge"

p attr_obj.respond_to? "hoge"  ←true

p attr_obj.hoge                ←nil まだ@hogeを定義していないから。

p attr_obj.attr                ←エラー。まだattrメソッドを定義していないから。undefined method `attr' for #<AttrClass:0x31d3598 @attr="attr">。


さくさくと完了