【问题标题】:Why is it wrong to replace curly brackets of block with "do..end" in Ruby? [duplicate]为什么在Ruby中用“do..end”替换块的大括号是错误的? [复制]
【发布时间】:2022-02-06 22:06:11
【问题描述】:

我正在尝试使用“reduce”来选择数组中最大的数,具体的逻辑判断写在一个块中。如果我将块包裹在大括号中,我会得到预期的结果。如果我用“do..end”包装块,我会得到一个 TypeError(0 不是符号也不是字符串)。

代码如下:

p [5, 2, 9, 10, 7, 89, 70].reduce(0) { |acc, cv|
  if cv > acc   
    acc = cv    
  else
    acc                
  end
}

【问题讨论】:

标签: ruby


【解决方案1】:

如果您不提供,Ruby 解析器将无法理解您的代码 p 方法的括号。

此版本有效:

p([5, 2, 9, 10, 7, 89, 70].reduce(0) do |acc, cv|
  if cv > acc   
    acc = cv    
  else
    acc                
  end
end)

【讨论】:

  • 另外值得注意的是,acc = cv 完全没有意义,因为块的返回值在下一次迭代中作为acc 传递。整个条件可以表示为[acc, cv].max
  • 这里只能使用括号有理论上的原因吗?
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2016-04-20
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多