2012-01-05 8 views
0

私はRuby/Railsに関する本を読んでいて、簡単なことについて質問があります。下のメソッド "turn"では、著者はクラスを参照する "self"を使用します。彼は「自己」をオフに左だけやった場合は、(あなたができることとできないことの点では)違いは、もしあれば、何であるこのコードのクラス変数の目的

direction = new_direction 

コード

class Car << ActiveRecord::Base 

    validates :direction, :presence => true 
    validates :speed, :presence => true 

    def turn(new_direction) 

    self.direction = new_direction 

    end 

end 
+0

、私は他の回答は、ARの側面を無視している理由notnsureんだけど、それらからあなたのお持ち帰りがクラスメソッドが順番に呼び出されなければならないことをする必要があります値を保持する。これは、Railsコードでよくある間違いであり、コメントで指し示しているので、それは失われません。 –

+0

また、@directionはもう一度異なり、永続化されないことにも注意してください。 –

+0

これらの回答はすべて私を少し助け、誰に小切手を与えるかわからない。 – Leahcim

答えて

1

ActiveRecord(持続) ARの実装のため、varsにはselfでアクセスする必要があります。

ここで、selfは、列(DB)変数を「通常の」永続化されていないインスタンスプロパティと区別します。違いは、値が保存または更新時にデータベースに保存されないことです。

3

背景:ルビーの「自己」の存在は、現在のオブジェクトを意味します。このようなクラスメソッドが表示されます。このメソッドは、インスタンスではなくクラスで定義されています。だから、

cookbook = Cookbook.new 
puts cookbook.is_awesome? 

:あなたはCookbook.find_recipeでそれを呼び出すと、あなたがして、インスタンス上is_awesome呼ぶだろうよう

class Cookbook 
    def self.find_recipe 
    end 
    def is_awesome? 
    true 
    end 
end 

これfind_recipeは、クックブック上の方法であるself.direction=が呼び出された理由作者はしないですメソッドにdirectionという名前の変数を作成したい。著者が持っていた場合:self.directionへ

car = Car.new 
car.direction = :left 
car.turn(:right) 
car.direction 
=> :left  

変更をし、それが正しく、インスタンスの変数を設定します:

class Car 
    attr_accessor :direction 
    def turn(new_direction) 
    direction = new_direction 
    end 
end 

は、その後、あなたは見るでしょう。

2

これはb

a = b 

の値にローカル変数aを設定します。しかし、これは異なっている:

self.a = b 

これは実際には、引数としてba=メソッドを実行します。これは、実際には意味:

self.a=(b) 

最後に、方法は受信機としてselfを提供してselfに呼び出すことができますが、同じことが割り当てのための真のないです。 a = bは、a=メソッドを呼び出すことはなく、ローカル変数のみを割り当てます。

1

はこちらをご覧ください:

direction = new_direction 

は「方向」とリターンというローカル変数を作成するのに対し、http://snippets.dzone.com/posts/show/7963

self.direction = new_direction 

は、車のインスタンス上の「方向」属性に新しい値を割り当てますその値はCarインスタンスを更新しません。例えば、私は次のように起こるはずと信じていそう

class Car << ActiveRecord::Base 

    validates :direction, :presence => true 
    validates :speed, :presence => true 

    def turn(new_direction) 
    self.direction = new_direction 
    end 

    def set_speed(new_speed) 
    speed = new_speed 
    end 
end 

alf = Car.new 

alf.direction = "North" 
alf.speed = 1 

alf.turn = "South" 
alf.set_speed = 5 

> alf.direction 
=> "South" 

> alf.speed 
=> 1 
+0

OK、 "5"の速度はクラス変数に設定されていないので持続しませんが、なぜ "alf.speed"は最後に "1"を返しますか?最初に通常の変数を使用して設定した場合、 "1"は持続する原因は何ですか?これについて少し説明できますか? – Leahcim

+0

@Michaelここには永続性はありません。set_speed *が持続可能な列フィールド "speed"を設定しない方法のデモです。永続性は、ARレコードが保存されるか、その属性が更新された場合にのみ再生されます。最後にalf.speedが "1"であることを確認しますか?これは、set_speedがインスタンス変数または列変数ではなく、ローカルの「速度」を設定しているためです。 –

+0

@DaveNewton感謝しました。set_speedがローカル速度だけを設定すると、alf.speed = 1もローカルの「速度」ですか? – Leahcim

関連する問題