0210デフォルトの名無しさん
2017/09/11(月) 22:10:48.79ID:8y57wnUU>逆に、他の言語で可能だけどRubyじゃできない書き方って何かあるの?
Ruby と競合するLLで、かつ関数型というパラダイムに限定すれば、
「関数は一級市民ではない」という制限がある
これは Ruby の世界だと「メソッドがオブジェクトではない」と
言い換えることができる
具体的なコードを Python で示そう:
(注:以下は Python を例にしているが、JavaScriptでも同様なコードは書ける)
>>> def add(x, y): return x + y # 関数 add を定義
... ^D
>>> add(1, 2) # 関数へ実引数 (1, 2) を適用
3
>>> f = add # 関数は値(=一級市民)だから、それを別の変数 f として宣言
>>> f(1, 2) # 変数 f へ実引数 (1, 2) を適用しても add と同じ結果になる
3
それに対して Ruby では:
irb(main):001:0> def add(x, y); x + y; end # メソッド add を定義
=> :add
irb(main):002:0> f = add # メソッドは値(=一級市民)ではないから..(略
ArgumentError: wrong number of arguments (given 0, expected 2)
from (irb):1:in `add'
from (irb):2
from /opt/local/bin/irb:11:in `<main>'