调用/应用lambda与函数调用 - Ruby中的语法是不同的.为什么?

Bre*_*eak 31 ruby lambda lambda-calculus

我是Ruby的新手,仍然试图理解一些语言设计原则.如果我做对了,Ruby中的lambda表达式调用必须是方括号,而"常规"函数调用是"常规"/圆括号.

语法有什么不同的特殊原因吗?或者,换句话说,(为什么)调用者应该知道他们是调用函数还是应用lambda表达式?

Mic*_*ohl 33

常规的Ruby方法调用()不使用用于块的花括号.如果您不喜欢[]调用lambda,则可以始终使用该call方法.

例:

>> by_two = lambda { |x| x * 2 } #=> #<Proc:0x0000000101304588@(irb):1>
>> by_two[5] #=> 10
>> by_two.call(5) #=> 10
Run Code Online (Sandbox Code Playgroud)

编辑

在较新版本的Ruby中:

>> by_two.(5) #=> 10
Run Code Online (Sandbox Code Playgroud)

至于为什么你不能这样做by_two(5),当Ruby看到一个裸字时,它首先尝试将其解析为一个局部变量,如果它作为方法失败.


J-_*_*_-L 28

因为在Ruby中,方法不是lambdas(例如,在JavaScript中).

方法总是属于对象,可以继承(通过子类或混合),可以在对象的本征类中覆盖,并且可以给出一个块(这是一个lambda).它们有自己的变量范围.示例方法定义:

a = :some_variable
def some_method
  # do something, but not possible to access local variable a
end

# call with:
some_method
Run Code Online (Sandbox Code Playgroud)

然而lambdas/procs是普通的闭包,可能存储在变量中 - 没有别的:

a = :some_variable
some_lambda = lambda{
  # do something, access local variable a if you want to
}

# call with:
some_lambda[]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 小一点,块不是 ruby​​ 中的 lambda。Lambda 是对象,块是 ruby​​ 代码的可执行片段。 (3认同)
  • 感谢您的反馈,添加了一些代码片段:) (2认同)

And*_*imm 11

如果你想要括号,你可以做到

by_two = lambda { |x| x * 2 }
by_two.(5) # => 10
Run Code Online (Sandbox Code Playgroud)

注意.之间by_two(5).