【问题标题】:Calling/applying lambda vs. function call - the syntax in Ruby is different. Why?调用/应用 lambda 与函数调用 - Ruby 中的语法不同。为什么?
【发布时间】:2011-09-14 16:30:49
【问题描述】:

我对 Ruby 有点陌生,但仍在尝试了解一些语言设计原则。如果我做对了,Ruby 中的 lambda 表达式调用必须使用方括号,而“常规”函数调用必须使用“常规”/圆括号。

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

【问题讨论】:

    标签: ruby lambda-calculus lambda


    【解决方案1】:

    常规 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 看到一个bareword 时,它首先会尝试将其解析为局部变量,如果失败则作为方法解析。

    【讨论】:

    • [1] 在我的问题中修复:“圆括号”而不是“卷曲”。我的错。 [2]假设by_two首先被解析为一个变量。这是否意味着原因仅仅是技术性的(调整解析器)? lambda调用与函数调用或其他东西中出现的不是任何真正不同的东西吗?这种差异不是反映在语言设计层面吗?
    • 请参阅下面 J-_-L 对 [2] 的回答。
    【解决方案2】:

    因为在 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
    

    【讨论】:

    • 非常感谢!是的,JavaScript 是我想到的一个反例!有一个关于块的例子是完美的,虽然我知道你的意思,但我仍然觉得我可能会从你的回答中学到更多:)
    • 小点,块不是ruby中的lambda。 Lambda 是对象,块是可执行的 ruby​​ 代码。
    【解决方案3】:

    如果你想要括号,你可以这样做

    by_two = lambda { |x| x * 2 }
    by_two.(5) # => 10
    

    注意by_two(5) 之间的.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多