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