私は Ruby を初めて使用し、言語設計の原則のいくつかを理解しようとしています。私が正しく理解していれば、Ruby でのラムダ式の呼び出しには角括弧を使用する必要があり、「通常の」関数呼び出しには「通常の」/丸括弧を使用する必要があります。
構文が異なる特別な理由はありますか? または、言い換えれば、(なぜ) 呼び出し元は、関数を呼び出すか、ラムダ式を適用するかを認識する必要がありますか?
私は Ruby を初めて使用し、言語設計の原則のいくつかを理解しようとしています。私が正しく理解していれば、Ruby でのラムダ式の呼び出しには角括弧を使用する必要があり、「通常の」関数呼び出しには「通常の」/丸括弧を使用する必要があります。
構文が異なる特別な理由はありますか? または、言い換えれば、(なぜ) 呼び出し元は、関数を呼び出すか、ラムダ式を適用するかを認識する必要がありますか?
通常の Ruby メソッド呼び出し()
では、ブロック用の中括弧を使用しません。[]
ラムダの呼び出しが気に入らない場合は、いつでもcall
メソッドを使用できます。
例:
>> by_two = lambda { |x| x * 2 } #=> #<Proc:0x0000000101304588@(irb):1>
>> by_two[5] #=> 10
>> by_two.call(5) #=> 10
編集
Rubyの新しいバージョンでも:
>> by_two.(5) #=> 10
だけを実行できない理由についてはby_two(5)
、Ruby がベアワードを検出すると、最初にそれをローカル変数として解決しようとし、それが失敗した場合はメソッドとして解決しようとします。
Ruby では、メソッドは (たとえば JavaScript のように) ラムダ式ではないためです。
メソッドは常にオブジェクトに属し、(サブクラス化またはミックスインによって) 継承でき、オブジェクトの固有クラスで上書きでき、ブロック (ラムダ) を与えることができます。変数には独自のスコープがあります。メソッド定義の例:
a = :some_variable
def some_method
# do something, but not possible to access local variable a
end
# call with:
some_method
ただし、ラムダ/プロシージャは単純なクロージャーであり、変数に格納される可能性があります-他には何もありません:
a = :some_variable
some_lambda = lambda{
# do something, access local variable a if you want to
}
# call with:
some_lambda[]
Ruby は両方のアプローチを強力な構文 (ブロックの受け渡しなど) と組み合わせます。
def some_method_with_block(a)
# do something, call given block (which is a lambda) with:
yield(a) ? 42 : 21
end
# example call:
some_method_with_block(1) do |x|
x.odd?
end #=> 42
ブラケットが必要な場合は、次のことができます
by_two = lambda { |x| x * 2 }
by_two.(5) # => 10
.
と の間by_two
に注意してください(5)
。