Last active
September 12, 2017 03:26
-
-
Save Y-Fujikawa/db51b7edf1b790cc85f4272bd0a3ec88 to your computer and use it in GitHub Desktop.
define_methodに関すること
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Animal | |
{ cat: 'にゃー', dog: 'わん' }.each do |name, message| | |
# 動的にクラスやモジュールを定義でき、defによるメソッド定義をしなくてもよい | |
# メソッド本体はブロックで記述する | |
define_method(name) do | |
message | |
end | |
end | |
end | |
puts Animal.new.cat | |
class Animal2 | |
{ cat: 'にゃー', dog: 'わん' }.each do |name, message| | |
# ブロックにブロック引数を加えるとブロック引数がメソッドの引数になる | |
# ブロック引数:name | |
define_method(name) do |num| | |
message * num | |
end | |
end | |
end | |
# メソッドの引数:2 | |
puts Animal2.new.dog(2) | |
class Animal3 | |
end | |
{ cat: 'にゃー', dog: 'わん' }.each do |name, message| | |
# ブロックをオブジェクトとして定義する | |
proc = Proc.new { |num| message * num } | |
# class_evalは、ブロックをクラス定義やモジュール定義の中のコードであるように実行する | |
# ブロックの戻り値がメソッドの戻り値になる | |
Animal3.class_eval { define_method(name, proc) } | |
end | |
puts Animal3.new.cat(3) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment