私はRubyの初心者ですが、言語設計の原則のいくつかを理解しようとしています。もしそれが正しければ、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
通常の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がベアワードを見つけると、最初にローカル変数として解決しようとし、それがメソッドとして失敗した場合。
ブラケットが必要な場合は、
by_two = lambda { |x| x * 2 }
by_two.(5) # => 10
.
の間に by_two
および(5)
。