我对 Ruby 有点陌生,但仍在尝试理解一些语言设计原则。如果我做对了,Ruby 中的 lambda 表达式调用必须使用方括号,而“常规”函数调用必须使用“常规”/圆括号。
语法不同是否有特殊原因?或者,换句话说,(为什么)调用者应该知道他们是调用函数还是应用 lambda 表达式?
我对 Ruby 有点陌生,但仍在尝试理解一些语言设计原则。如果我做对了,Ruby 中的 lambda 表达式调用必须使用方括号,而“常规”函数调用必须使用“常规”/圆括号。
语法不同是否有特殊原因?或者,换句话说,(为什么)调用者应该知道他们是调用函数还是应用 lambda 表达式?
常规 Ruby 方法调用()
不使用用于块的花括号。如果您不喜欢[]
调用 lambda,您可以随时使用该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 中,方法不是 lambda(例如,在 JavaScript 中)。
方法总是属于对象,可以被继承(通过子类或混合),可以在对象的特征类中被覆盖,并且可以被赋予一个块(它是一个 lambda)。它们有自己的变量范围。示例方法定义:
a = :some_variable
def some_method
# do something, but not possible to access local variable a
end
# call with:
some_method
然而 lambdas/procs 是普通的闭包,可能存储在一个变量中 - 没有别的:
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)