2012-02-14 18 views
14

Özel bir sınıfım var ve görev operatörünü geçersiz kılmak istiyorum. amaçlandığı gibiÇoklu argümanlar ile ayar yöntemi (atama)

class MyArray < Array 
    attr_accessor :direction 
    def initialize 
    @direction = :forward 
    end 
end 
class History 
    def initialize 
    @strategy = MyArray.new 
    end 
    def strategy=(strategy, direction = :forward) 
    @strategy << strategy 
    @strategy.direction = direction 
    end 
end 

Bu, şu anda çalışmıyor: İşte bir örnek.

h = History.new 
h.strategy = :mystrategy, :backward 

[:mystrategy, :backward] kullanımı üzerine strateji değişkeni tahsis ve yönde değişken :forward kalır alır.
Önemli olan, yön parametresine standart bir değer atayabilmem.

Bu çalışmayı yapmak için herhangi bir ipucu çok takdir edilmektedir.

cevap

14

nedeniyle isimleri = sona yöntemlerin sözdizimi şeker, aslında yönteme birden çok parametre iletebilirsiniz tek yolu olan ... ...

h.send(:strategy=, :mystrategy, :backward) 

sözdizimi şeker atlayıp send kullanmaktır vaka siz de sadece daha iyi isimlerle normal yöntemi kullanabilirsiniz:

h.set_strategy :mystrategy, :backward 

Ancak, yönteminizi yazabilirsiniz otomatik un-dizi değerleri eğer Bu benim için bir brüt kesmek gibi görünüyor

def strategy=(value) 
    if value.is_a?(Array) 
    @strategy << value.first 
    @strategy.direction = value.last 
    else 
    @strategy = value 
    end 
end 

Ancak: Bir dizi parametre için yasal asla olduğunu biliyorlardı. İhtiyacınız varsa, bir argüman olmayan yöntem adını çoklu argümanlar ile kullanırdım.


Alternatif öneri: Sadece tarifi nedir hakkında :forward ve :backward ise: Ayarladığınızda

def forward_strategy=(name) 
    @strategy << name 
    @strategy.direction = :forward 
end 

def reverse_strategy=(name) 
    @strategy << name 
    @strategy.direction = :backward 
end 
+0

Alternatif uygulama için başka bir öneri eklemek üzere düzenlenmiştir. – Phrogz

+0

Değerin bir Array olup olmadığını kontrol ettiğiniz öneriyi beğeniyorum. Onun brüt bir hack olduğunu söylüyorsun. Bunu kullanmak nerede sorun yaratabilir? – FlyingFoX

+1

@FlyingFoX Bu, deyimsel olmayan, kendi kendini belgelemeyen ve genel olarak uygulanabilir olmayan (birisinin bir diziyi ilk parametre olarak geçirmek isteyebileceği durumlarda) olduğu gibi bir "brüt hack" dir. – Phrogz

2

sorun

def strategy=(strategy, direction = :forward) 
    @strategy = strategy 
    @strategy.direction = direction 
end 

olduğunu

h.strategy = :mystrategy, :backward 

aslında orijinal @strategy örneğini geçersiz kılıyorsunuz. Bu çağrıdan sonra, @strategy, değil, Symbol örneğidir.

Ne yapmak istersiniz? Nesneyi değiştirin veya güncelleyin?

+0

Oh sry yöntemi karıştırmış gibi görünüyor. @strategy << stratejisi olmalıdır. – FlyingFoX

+0

Oh; Yani bir stratejinin bir yönü yok, aksine bir strateji ve güncel bir yönünüz var mı? – Phrogz