2011-12-05 12 views

答えて

13

関数を定義するように動作しないクラスを定義するには、内部変数を使用し、それらの機能を定義する必要があり、かつ呼び出したときにそれを伝える初期化子は何をすべきかattr_accessorはに役立ちます.new

関数と変数を設定するのは難しい。ほとんどの最も簡単な方法はinitializeいくつかの変数を持つクラスに新しい機能を使用するために

class Couple 
    attr_accessor :one, :two 
end 

couple1 = Couple.new 
couple1.one = 10 
couple1.two = "Ten" 
p couple1.one 
p couple1.two 

のようなクラスを持って使用することです、あなたはあなたの

class Couple 
    attr_accessor :one, :two 

    def initialize(one, two) 
    @one = one 
    @two = two 
    end 
end 

couple1 = Couple.new(10, "Ten") 
p couple1.one 
p couple1.two 
のように見えるクラス定義を与えて、その関数を定義することができます
0

読み込みにはattr_reader、読み込み/書き込みにはattr_accessorを使用する必要があります。あなたのクラスには、次のようになります。

class Couple 
    attr_accessor :one, :two 

    def initialize(one, two) 
    @one = one 
    @two = two 
    end 
end 

attr_accessorを使用して、この場合には、メソッドone, one=, two, two=を作成します。 attr_readerを使用する場合、メソッドone, twoが作成されます。また、あなたの方法one=, two=を与えるattr_writer、あり

couple = Couple.new(5, 6) 
p couple.one # Outputs 5 
p couple.two # Outputs 6 
couple.one = 7 
p couple.one # Outputs 7 

が、これは、あなたがこのケースで探しているものではありません。上記のコード例を使用

、あなたが持っている可能性があります。これは、変数へのアクセスのみを書き込みます。

4

アイテムのペアを保持するだけでよい場合は、Structを使用します。これは、変数とアクセサのみを含むクラスの単純なジェネレータです。それ以外は何もありません(同様のC/C++のStructと同じです)。

Couple = Struct.new(:one, :two) 

# Or more idiomatically 
class Couple < Struct.new(:one, :two) 
    def to_s 
    "one: #{self.one}, two: #{self.two}" 
    end 
end 

couple1 = Couple.new(10, 'ten') 
puts couple1 # one: 10, two: ten 

couple1.one = 100 
puts couple1 # one: 100, two: ten 

また、Rubyで1つの非常に興味深いのは、クラスのデータ/メンバー、インスタンスとクラスの両方が/静的なものは、「プライベート」であるということです - あなただけのアクセサメソッドを介して外部からアクセスすることができ、直接ではなく、 Rubyはマクロatrr_accessor,attr_reader、およびattr_writerを使ってこれらのメソッドを迅速に生成することができます。

class Couple 
    one = 'o' 
    two = 't' 
end 

p Couple.one # NoMethodError: undefined method `one' for Couple:Class 


class Couple 
    def initialize(one, two) 
    @one = one 
    @two = two 
    end 
end 

c = Couple.new(10, 'ten') 
p c.one # undefined method `one' for #<Couple:0x936d2d4 @one=10, @two="ten"> 

だから、アクセサーが必要です。

関連する問題