0

次のコード:

str = "1, hello,2"
puts str
arr = str.split(",")
puts arr.inspect
arr.collect { |x| x.strip! }
puts arr.inspect

次の結果が生成されます。

1, hello,2
["1", " hello", "2"]
["1", "hello", "2"]

これは予想通りです。次のコード:

str = "1, hello,2"
puts str
arr = (str.split(",")).collect { |x| x.strip! }
puts arr.inspect

ただし、次の出力が生成されます。

1, hello,2
[nil, "hello", nil]

これらの「nil」を取得するのはなぜですか? 分割配列で .collect をすぐに実行できないのはなぜですか?

助けてくれてありがとう!

4

2 に答える 2

1

この#collectメソッドは、各ブロックの呼び出しによって返される値の配列を返します。最初の例では、実際の配列の内容を変更し#strip!て使用していますが、の戻り値は無視しています#collect

2 番目のケースでは、#collect結果を使用します。問題は、結果に応じて#strip!文字列またはを返すことです。特に、文字列が変更されていない場合は返されます。nilnil

したがって、#strip(感嘆符なしで)次を使用します。

1.9.3-p194 :005 > (str.split(",")).collect { |x| x.strip }
 => ["1", "hello", "2"] 
于 2012-08-05T16:18:09.000 に答える
1

文字列が変更されていない場合に#strip!返されるためです。nil

初期の例では#collect,、文字列を で変更しただけの結果を使用していませんでした#strip!。その場合に使用#eachすると、機能しない命令ループがもう少し明確になります。通常、結果の新しい配列を使用する場合にのみ#map/を使用します。#collect

最後のアプローチは良さそうです。関数マップを作成しましたが#strip!!.

于 2012-08-05T16:18:14.127 に答える