2

文字列変数の配列内の単語を逆にしようとしていますが、splitが機能していないようです。

IRBでテストすると、「NoMethodError:配列に対して呼び出されたプライベートメソッド `split'」が表示されます。これは、プログラムが静かに何もしていないことと関係があると思います。

たとえば、私は次のようにしています。

nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"].

私は戻ることを期待しています:

["Blow Joe", "Sue Mary", "Mallory Alice"].

そのため、配列を繰り返し、分割、反転、結合します。これは何も起こらないところです:

nameList.each { |x| 
  x.to_s.split(' ').reverse!.join(' ')
  puts x   #testing here
}

これは以下を出力します:

Joe Blow
Mary Sue
Alice Mallory

これはそれほど難しいことではないので、私は非常に単純なものを見逃しているに違いありません。

4

3 に答える 3

7

結果を分割、反転、破棄しています。これをチェックしてください。

nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"]

nameList.each { |x| 
  puts x.to_s.split(' ').reverse.join(' ')
  puts x
  puts '' # for easier reading   
}
# >> Blow Joe
# >> Joe Blow
# >> 
# >> Sue Mary
# >> Mary Sue
# >> 
# >> Mallory Alice
# >> Alice Mallory
# >> 

配列のすべての要素に変換を適用し、新しい値を取得して、これらの値の新しい配列を作成する場合は、Array#map関数を使用するのが慣用的です。

nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"]

newList = nameList.map { |x| 
  x.to_s.split(' ').reverse.join(' ')
}

また、ここでは、bangバージョンのreverse(reverse!)を使用しないでください。破壊的なセマンティクスがあります。ソース配列を所定の位置で更新reverseしながら、新しい逆配列を作成します。reverse!この場合、ソース配列は一時変数であるため、結果的には違いはありません。しかし、私はそれが混乱し、気が散ると思います。

于 2012-05-28T18:36:17.507 に答える
2

コンパクトバージョン:

nameList.map!{ |x| x.split.reverse.join(' ') }
#=> ["Blow Joe", "Sue Mary", "Mallory Alice"]
于 2012-05-28T20:09:17.183 に答える
0

問題

Rubyのすべてに戻り値があります。この場合、メソッドチェーンの戻り値は使用していません。元の値を印刷しているだけです。

nameList.each { |x| 
  # Returns a result, but you aren't doing anything with it.
  x.to_s.split(' ').reverse!.join(' ')

  # Here you print your original value.
  puts x   #testing here
}

ソリューション

これを行う簡単な方法は、配列を返す#collectを使用することです。

p nameList.collect { |name| name.split.reverse.join(' ') }
["Blow Joe", "Sue Mary", "Mallory Alice"]
=> ["Blow Joe", "Sue Mary", "Mallory Alice"]

これにより、変更された配列が出力され、さらに処理するために結果として配列が返されます。または、本当に配列を変更したい場合は、次のように結果を割り当てることができます。

nameList = nameList.collect { |name| name.split.reverse.join(' ') }
 => ["Blow Joe", "Sue Mary", "Mallory Alice"] 
nameList
 => ["Blow Joe", "Sue Mary", "Mallory Alice"]

これを行う方法は確かに他にもありますが、読みやすくすることが重要です。この場合、意図が明確になるように、変数に配列を割り当てるセマンティクスを維持することは理にかなっています。

于 2012-05-28T20:17:49.423 に答える