2010-12-28 16 views
11

nil bunu yapmak için:Ruby - üste etkinleştirme/çoklu atama (örneğin `a, b, c = d, e f`)

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

a , b ve c, alacak sırasıyla 1, 2 ve 3 değerleri. Bir Array ve yakut bu durumda

d

, bu a, b ve c içeriğini var atamak bilir. Ancak, d bir Fixnum olsaydı, d değerine sadece a atanırsa b ve c nil atanacaktır.

d'un hangi özellikleri birden çok ödev için kullanılmasına izin verir? Şu ana kadar araştırmamda, sadece Array alt sınıflarının örneklerini bu şekilde davrandım.

cevap

11

Bu çok belgesiz bir özelliktir ve bunu dikkatle kullanırdım, ama işte başlıyoruz. kitaptan Yakut Programlama Dili:

birden Sol taraf ve sadece tek rvalue vardır

, Yakut atamak bir değerler listesine rvalue genişletmek dener. Değer bir dizisiyse, Ruby diziyi genişletir böylece her öğe kendi rengin olur. Değer bir dizi değil, ancak bir to_ary yöntemi uygularsa, Ruby bu yöntemi çağırır ve daha sonra döndürdüğü diziyi genişletir.

Ruby 1.8 yılında 1.9 belgelerine to_splat çağırır diyor Ruby to_ary yöntem , ama (bu makinede hiçbir 1.9) test etmedim beklendiği gibi O çalışmadı. Yani, nesnenizde bir to_ary yöntemi tanımlamanız gerekir.

class Week 
    def to_ary 
    %w(monday tuesday wednesday thursday friday saturday sunday) 
    end 
end 

mon, tue, wed, thu, *weekend = Week.new 

* %w(...) kelime dizisi için özel bir gösterim mu, ['monday', 'tuesday' ...]

+0

yazmak için tembel ise bence Ruby deneyin! 1.9 kullanır. Ya da bunu tamamen bırakıp jQuery RVM'yi kullanabilirsiniz. –

+0

:) Aslında cevaptan sonra 'rvm 1.9.1’i yükledim – Chubas

7

d'un hangi özellikleri birden çok ödev için kullanılmasına izin verir?

d

bir Array edilmeyebilir ya da bir dönüştürülebilir olması gerekir. IOW bir Array sınıfının örneğini (veya alt sınıflarından herhangi biri) olmalı veya to_ary mesaja yanıt gerekir: Bu Ruby daha genel bir modelinin bir örneği olduğunu

def (not_an_array = Object.new).to_ary; [:foo, :bar, :baz] end 

foo, bar, baz = not_an_array 

foo # => :foo 
bar # => :bar 
baz # => :baz 

Not: hemen hemen bütün yöntemleri bir Array bekliyoruz Yakut, bir String, ayrıca to_ary, to_str, to_int veya to_float yanıt bir nesne kabul edecek bir Integer veya Float. Ve bu arada, kendi yöntemleriniz de olmalı!

İlgili konular