Ruby:调用3: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
    
已邀请:
您正在数字对象上调用方法
split
-该方法在
String
类中存在,但在
Fixnum
中不存在。 我认为您正在尝试执行以下操作:
DATA = [\'3,4\', \'5,6\', \'7,8\']
DATA.each do |val|
  vals = line.split \',\'
  print vals[0] + vals[1], \" \"
end
    
目前尚不清楚您要做什么。您没有\“ line \”,而数组中的元素为Integer值。
Split
是在
String.
上定义的方法
DATA = [3, 4, 5, 6, 7, 8]
DATA.each do |val|
  print val
end
现在,您收到令人困惑的错误消息的原因有些有趣。碰巧的是,有一个ѭ9,它使脚本具有类似于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(),系统中的每个对象都会响应,但幸运的是只会出现错误。 通过将其设为私有方法,它可以在脚本的顶层使用(因为“ Object”是打开的或类似的东西),但不会成为每个实例化对象的API的一部分。     
猜测您可能真正想要的是:
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
    

要回复问题请先登录注册