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

あなたが何をしようとしているのかは明確ではありません。「行」はありません。整数値である配列の要素があります。で定義されたメソッドですSplitString.

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 に答える