せかいや

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

【Ruby】パーフェクトRuby 学習感想文 ~第9章 その2

10章に行く前に、
9章の中で少し複雑な例があったので、実際に書いて確認しました。

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

 


P295

class KeywordArgs

	def normal_method_allow_keyword_args(ichi, ni, san)
		[ichi + "dayo", ni + "dayo", san + "dayo"]
	end
	
	private
	
	def method_missing(name, *args)
		method_name = name.to_s + '_allow_keyword_args'
		
		p args
		
		args_hash = args.first
		
		p args_hash
		
		new_args = self.method(method_name).parameters.map do |(req, arg_name)|
		
			args_hash[arg_name]
		end
		
		__send__ method_name, *new_args
	end
end

p KeywordArgs.new.normal_method(san: '1', ichi:'2', ni: '3')

 
■結果

[{:san=>"1", :ichi=>"2", :ni=>"3"}]
{:san=>"1", :ichi=>"2", :ni=>"3"}
["2dayo", "3dayo", "1dayo"]


最初分からなかったのは、可変長引数の*arg.first で何が返ってくるのかという所。
可変長引数は配列で定義されているんだね。
だからfirstメソッドを使ってHash自体を取り出すのか。

あと、__send__メソッドで何をしているのか分からなかったので、
"dayo"をつけて分かりやすくしました。
「処理の最後の実行結果が返ります」というRubyの原則を、まだうっかり忘れてしまう。