2012-03-18 19 views
1

私は少しRuby、noobです。私が得られない基本的なことがいくつかあります。私はこのようなものがあります:私はmy_methodを呼び出すとき値が割り当てられてもプロパティは変更されませんか?

def my_method 
    attr1 = 'new 1 value' 
    attr2 = 'new 2 value' 
    puts "#{attr1} - #{attr2}" 
    puts "Should be same? #{to_s}" 
end 

def to_s 
    "#{attr1} - #{attr2}" 
end 

を私が取得:

new 1 value - new 2 value 
Should be same? old 1 value - old 2 value 

えっ?

+0

これはクラスですか? –

+0

あなた、マーク。それはクラスにあります。 –

+1

self.attr1/2で試してください。 –

答えて

1

obj.x = y 

x=を送信常にであるルビー

x = y 

可変xyた値の常に割り当てているからですメッセージオブジェクトobjyの結果の値)。

ルビーの属性/プロパティは本当に単なる方法です!このように、試してください:一方

self.attr1 = 'new 1 value' 
self.attr2 = 'new 2 value' 

yがまたはであってもなくてもよいメソッド呼び出しを(:プロパティフェッチ読み取ります)。変数shadowのメソッドのため、スコープ内に既に変数yがあるかどうかによって異なります。このため、attr1attr2to_sで動作し、プレフィックスを付ける必要はありません。

ハッピーコーディング。

1

これはスコープですattr1attr2はローカル変数です。

to_sを呼び出すときに、(おそらく)クラススコープで宣言したattr_1attr_2を探しています。小さな変数で新しい変数を作成したのではなく、my_methodを実行すると上書きされません。

@attr_1@attr_2を代わりに使用してください。

チェックアウトLocal Variable Gotchas

+0

タグに基づいて、私はそれらがAR属性だと思う、そうでなければまったく動作しないだろう。 –

+0

それは本当ですが、彼の疑問文句は基本的なRubyの質問のように聞こえますが、私が最初にRailsと 'virtual_attributes 'を使って作業を始めたとき、私はこのような問題がありました。 – Azolo

1

それを行うには、2つの方法があります。一つは、代わりにローカル変数のクラススコープの変数を使用することです:

class MyClass 

    def my_method 
     @attr1 = 'new 1 value' 
     @attr2 = 'new 2 value' 
     puts "#{@attr1} - #{@attr2}" 
     puts "Should be same? #{self.to_s}" 
    end 

    def to_s 
     "#{@attr1} - #{@attr2}" 
    end 
end 

m = MyClass.new 
m.my_method 

出力:

new 1 value - new 2 value 
Should be same? new 1 value - new 2 value 

他の方法は、あなたが、具体的self上のメソッドとして呼び出す必要があります属性を使用することです。

class MyClass 
    attr_accessor :attr1,:attr2 

    def my_method 
     self.attr1 = 'new 1 value' 
     self.attr2 = 'new 2 value' 
     puts "#{attr1} - #{attr2}" 
     puts "Should be same? #{self.to_s}" 
    end 

    def to_s 
     "#{attr1} - #{attr2}" 
    end 
end 

m = MyClass.new 
m.my_method 

これは同じ出力です。

+0

タグに基づいて、私は彼らがAR属性である可能性が高いと思います。 –

+0

その場合、第2の解決策は、彼がアクセサを宣言する必要がないことを除いて、請求書に適合する。 –

関連する問題