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 

目前尚不清楚你要做什么。 你没有“行”,你有一个来自Array的元素是一个Integer值。 Split是在String.定义的方法String.

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

现在,你得到这个令人困惑的错误信息的原因有点有趣。 碰巧的是,有一个Kernel#split ,允许类似Perl的简洁脚本。 它拆分全局变量$_ ,它保存了get的最后一个结果。

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

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

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

通过使它成为一个私有方法,它可以在顶级脚本中使用(因为“对象”是打开的或其他东西),但不会成为每个实例化对象的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