yield 命令在 Ruby 中无法正常工作

问题描述 投票:0回答:1

“The Well-Grounded Rubyist”一书第 3 版第 185 页是代码。而my_each的代码在183页,还涉及到184页的代码:

Class Array
# Put the definition of my_each here
  def my_each
    c = 0
    until c == size
      yield self[c]
      c += 1
    end
    self
  end
# Here ends my_each
  def my_map
    acc = []
    my_each {|e| acc << yield e }
    acc
  end
end
# Code on page 184
names = ["David", "Alan", "Black"]
names.my_map {|name| name.upcase }
# Code on page 184 ends

运行时收到此错误消息:

page185a.rb:14: syntax error, unexpected local variable or method, expecting '}'
(SyntaxError)
my_each {|e| acc << yield e }

^
位于上行最后一个 e 的下方。

我尝试将线路的各个部分分成不同的部分 线,但我无论如何都无法让它工作。即使在另一个 程序中我遇到了产量问题,但我已经解决了 通过使用其他代码。但这个问题对我来说一直很难解决。我是 Ruby 新手,所以我需要学习这个。这两个程序的相同之处在于 << and yield.

的组合
ruby yield
1个回答
0
投票

yield
是一个关键字,因此与其他运算符(例如
<<
)一起使用时,与普通方法调用具有不同的特殊性。在你的例子中,Ruby 解析你的
my_map
方法如下:

def my_map
  acc = []
  my_each {|e| (acc << yield) e }
  acc
end

这是行不通的,因为

e
在这里不能作为参数。但是,您可以通过在yield调用的正确位置显式添加括号来避免此问题:

def my_map
  acc = []
  my_each {|e| acc << yield(e) }
  acc
end
© www.soinside.com 2019 - 2024. All rights reserved.