10

次のような属性配列があります。

attributes = ["test, 2011", "photo", "198.1 x 198.1 cm", "Photo: Manu PK Full Screen"]

私がこれをするとき、

artist = attributes[-1].gsub("Photo:")
p artist

ターミナルで次の出力を取得します

#<Enumerator: "Photo: Manu PK Full Screen":gsub("Photo:")>

出力として列挙子オブジェクトを取得するのはなぜですか? 前もって感謝します。

attributes[-1].gsub("Photo:", ""), I am doing attributes[-1].gsub("Photo:")編集: So の代わりに、列挙子オブジェクトがここに返された理由 (エラー メッセージが表示されることを期待していました) と、何が起こっているのかを知りたいことに注意してください。

ルビー-1.9.2

レール - 3.0.7

4

2 に答える 2

18

Enumeratorオブジェクトは、列挙型に共通のいくつかのメソッドを提供します -- nexteacheach_with_indexrewindなど。

非常に柔軟Enumeratorであるため、ここでオブジェクトを取得しています。gsub

gsub(pattern, replacement) → new_str
gsub(pattern, hash) → new_str
gsub(pattern) {|match| block } → new_str
gsub(pattern) → enumerator 

最初の 3 つのケースでは、置換はすぐに実行され、新しい文字列が返されます。ただし、置換文字列、置換ハッシュ、または置換用のブロックを指定しない場合は、Enumerator後で作業するために文字列の一致する部分に到達できるオブジェクトが返されます。

irb(main):022:0> s="one two three four one"
=> "one two three four one"
irb(main):023:0> enum = s.gsub("one")
=> #<Enumerable::Enumerator:0x7f39a4754ab0>
irb(main):024:0> enum.each_with_index {|e, i| puts "#{i}: #{e}"}
0: one
1: one
=> " two three four "
irb(main):025:0> 
于 2011-12-13T07:02:49.327 に答える
5

ブロックも 2 番目の引数も指定されていない場合、gsub は列挙子を返します。詳細については、こちらをご覧ください。

それを削除するには、2 番目のパラメーターが必要です。

attributes[-1].gsub("Photo:", "")

または

attributes[-1].delete("Photo:")

お役に立てれば!!

于 2011-12-13T07:02:12.623 に答える