はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
辞書の値が関数 (Python)
def a(k, v):
print(k, v)
def b(k, v):
print(k, v)
h = {'func a': a, 'func b': b}
h['func a']('A', 1)
h['func b']('B', 2)
# A 1
# B 2
辞書の値に関数を入れておいて、引数を渡します。
動的プログラミングですねえ。
失敗 (Ruby)
def a(k, v)
p [k, v]
end
h = {'func a' => a}
main.rb:1:in `a': wrong number of arguments (given 0, expected 2) (ArgumentError)
ハッシュにメソッドを入れた時点でエラーになります。
成功 lambda (Ruby)
a = lambda { |k, v| p [k, v] }
b = lambda { |k, v| p [k, v] }
h = {'func a' => a, 'func b' => b}
h['func a'].call('A', 1)
h['func b'].call('B', 2)
# ["A", 1]
# ["B", 2]
lambda
だと成功します。
成功 method (Ruby)
def a(k, v)
p [k, v]
end
def b(k, v)
p [k, v]
end
h = {'func a' => 'a', 'func b' => 'b'}
method(h['func a']).call('A', 1)
method(h['func b']).call('B', 2)
# ["A", 1]
# ["B", 2]
def
のままで行いたい場合は、method
を使用します。
成功 class (Ruby)
class A
def self.call(k, v)
p [k, v]
end
end
module B
def self.call(k, v)
p [k, v]
end
end
h = {'func a' => A, 'func b' => B}
h['func a'].call('A', 1)
h['func b'].call('B', 2)
# ["A", 1]
# ["B", 2]
class
もmodule
もいけてる。
メモ
- Python の 辞書の値が関数 を学習した
- 百里を行く者は九十里を半ばとす