2

我正在尝试了解这个简单函数的细微差别,但不确定我需要做什么来修复这个 NoMethodError。如何使“拆分”公开而不是私有?这能解决问题吗?

这是我的代码:

DATA = [3, 4, 5, 6, 7, 8]
DATA.each do |line|
vals = line.split
print vals[0] + vals[1], " "
end

这是我在 IRB 中运行时收到的错误消息:

NoMethodError: private method `split' called for 3:Fixnum
4

3 回答 3

4

目前尚不清楚您要做什么。你没有“线”,你有一个来自数组的元素,它是一个数值。Split是一个定义在String.

DATA = [3, 4, 5, 6, 7, 8]
DATA.each do |val|
  print val
end

现在,您收到令人困惑的错误消息的原因有点有趣。碰巧的是,有一个Kernel#split允许脚本使用类似 Perl 的简洁性。$_它将保存最后一个结果的全局变量从gets.

>> gets
how now brown cow
=> "how now brown cow\n"
>> split ' '
=> ["how", "now", "brown", "cow"]
>> puts $_
how now brown cow

但是被混入到 Object 中,所以它在脚本级别可用,这就留下了一个问题,即曾经创建的每个类最终都有一个#split方法。

如果你运行普通的旧 split() 系统中的每个对象都会响应,但幸运的是只有一个错误。

通过使其成为私有方法,它可以在脚本的顶层使用(因为“对象”是开放的或其他东西),但不会最终成为每个实例化对象的 API 的一部分。

于 2011-04-17T23:55:01.813 回答
1

您正在split对数字对象调用该方法——该方法存在于String类中,但不存在于Fixnum.

我认为你想要做的是:

DATA = ['3,4', '5,6', '7,8']
DATA.each do |val|
  vals = line.split ','
  print vals[0] + vals[1], " "
end
于 2011-04-17T23:55:26.923 回答
0

猜测你可能真正想要什么:

DATA = 3..8
DATA.each_cons(2) do |a,b|
  puts "#{a} + #{b} = #{a+b}"
end
#=> 3 + 4 = 7
#=> 4 + 5 = 9
#=> 5 + 6 = 11
#=> 6 + 7 = 13
#=> 7 + 8 = 15

编辑:基于对连续对进行操作的愿望:

DATA = 3..8    # or DATA = [3,4,5,6,7,8]
DATA.each_slice(2) do |a,b|
  puts "#{a} + #{b} = #{a+b}"
end
#=> 3 + 4 = 7
#=> 5 + 6 = 11
#=> 7 + 8 = 15
于 2011-04-18T00:01:02.040 回答