【问题标题】:Which one is a Ruby deprecated proc?哪个是 Ruby 已弃用的 proc?
【发布时间】:2013-03-17 15:42:07
【问题描述】:

在 Dave Thomas 与 Chad Fowler 和 Andy Hunt 合着的 Programming Ruby: The Pragmatic Programmers Guide 一书中,关于 Procs 的创建,有一个脚注指出:

“实际上还有第三个,proc,但它实际上已被弃用。”

我找不到这是哪条路。我知道创建Proc 的以下方法:

1

b = lambda { | msg | puts "msg: #{msg}" }
b.call("hi")

2

def create_block_object(&block)
  block
end
b = create_block_object{ |msg| puts "msg: #{msg}" }
b.call("hello")

3

b = Proc.new { |msg| puts "msg: #{msg}"}
b.call("hey")

我想知道第四个方法,如果有人能给我答案,我会很高兴。

【问题讨论】:

  • 你能准确引用书中的内容吗?
  • @fmendez 感谢您的回复。这是一本书的脚注6. There’s actually a third, proc, but it is effectively deprecated.@sawa 非常感谢您的编辑
  • 自 Ruby 1.9 起,数字 1 已被弃用,取而代之的是 davidrac 答案中的符号。
  • 谢谢@sawa,现在很清楚了
  • @sawa:你有 lambda 被弃用的来源吗?从 Black 的书中可以清楚地看出,Kernel#proc 方法就是他的意思。

标签: ruby lambda proc ruby-1.8


【解决方案1】:

您所指的书是关于 Ruby 1.8 的。

在那个版本的 Ruby 中,lambdaprocs 实际上是别名,而 Proc 是不同的野兽。这显然是一种误导,这就是为什么不建议您使用proc,如

prc = proc {|x, y| puts x + y}

此语法已被弃用,建议在这种情况下使用 lambda。

这不再适用于 Ruby 的更高版本,从 1.9 开始。

【讨论】:

  • 谢谢,我发现你是对的,因为书中从未提及你提供的方法
  • 其实Kernel#proc相当于Ruby 1.9之前的Kernel#lambda,相当于1.9的Proc.new(不确定2.0)。出于这个原因,Black 告诫不要使用它(因为 lambda 和非 lambda Procs 的语义不同)。这写在第 22 章(“Ruby 语言”)“块、闭包和 Proc 对象”一节的脚注中。
【解决方案2】:

这是 lambda 的另一种语法:

b = ->(msg) { puts "msg: #{msg}" }
b.call("hi")

【讨论】:

  • 谢谢,我知道,它从 Ruby 1.9 开始也存在,我猜它并没有真正被弃用
【解决方案3】:

prc = 过程 {|x| x*x} 已折旧。

这种语法主要用于 Ruby-1.8.7 版本。

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2015-06-22
    • 2019-03-23
    • 2014-02-12
    • 2023-03-08
    相关资源
    最近更新 更多