将字母数组与reduce组合时的未定义方法

时间:2017-06-22 00:21:35

标签: ruby

以下代码:

a = "h", "e", "l", "l", "o"

r = a.reduce(){|a, e|
  puts "a class: " + a.class.to_s;
  a + e;

  puts "a: " + a.to_s()
  puts "e: " + e.to_s
}

产生以下输出:

a class: String
a: h
e: e
a class: NilClass
undefined method `+' for nil:NilClass
(repl):5:in `block in <main>'
(repl):3:in `each'
(repl):3:in `reduce'
(repl):3:in `<main>'

但是当我在没有puts调用的情况下运行代码时,运行正常。有人可以就此问题提供澄清吗?

1 个答案:

答案 0 :(得分:4)

如果您稍微更改了代码(例如以下内容),问题就解决了:

a = "h", "e", "l", "l", "o"

r = a.reduce{|a, e|
  puts "a class: " + a.class.to_s
  puts "a: " + a.to_s
  puts "e: " + e.to_s
  a + e
}

原因是您传递给reduce的块(即{}中的代码)评估为nil,因为最后一个语句puts返回nil }。

使用上面的固定代码,块会评估(“返回”)最后一个语句a + e的结果,这可能是你想要减少字符数组的结果。