Ruby:私有方法调用3:Fixnum

时间:2011-04-17 23:51:24

标签: ruby split nomethoderror fixnum

我正在尝试学习这个简单函数的细微差别,但我不确定我需要做些什么来修复这个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

3 个答案:

答案 0 :(得分:4)

目前尚不清楚你要做什么。如果没有“行”,则 Array 中的元素是 Integer 值。 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的一部分。

答案 1 :(得分:1)

您在数字对象上调用方法split - 此方法存在于String类中,但不存在于Fixnum中。

我认为你要做的是:

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

答案 2 :(得分: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