6
module Pigged
  String.class_eval do
    def pig
      newstring = self + self[0]; newstring[0] = ""; newstring += "ay"
      return newstring
    end
  end
end

関連するコードです。私がやりたいpig!のは、元の文字列を変更するメソッドを作成することです。それは許可されていないため、自己を変更せずにどうすればよいですか...?

4

4 に答える 4

15

私はあなたのコードを少し要約し、pig!メソッドを追加しました:

module Pigged
  String.class_eval do
    def pig
      self[1..-1] + self[0] + 'ay'
    end
    def pig!
      self.replace(pig) #self.replace(self[1..-1] + self[0] + 'ay')
    end
  end
end
于 2012-04-30T23:10:26.077 に答える
4

自分自身を修正してはいけません。

replaceまたはカスタム メソッドを使用します。

読む '書き方「変えろ!」for String ' 詳細については、.

于 2012-04-30T20:30:53.657 に答える
4

String の場合、self.replace を使用して内容を変更できます。

他のクラスについては、新しいオブジェクトを作成しない限り、自分自身を変更できないと思います。

于 2012-04-30T20:32:56.570 に答える
2

を変更しても問題はありselfません。代入はできませんが、アクセサ メソッドを使用して変更したり、直接アクセスできる場合はインスタンス変数を変更したりできます。String#replaceこの特定のケースではアクセサです。

もう一つの例:

class Array
  def delete_first_element!
    self[0..0] = []
  end
end

a = [1,2,3]
b = a

a.delete_first_element!

puts a.inspect # [2,3]
puts b.inspect # [2,3]!

覚えておくべきことの 1 つは、同じオブジェクトのすべての参照を変更することです (b私の例では)。

于 2012-04-30T21:25:33.673 に答える