2009-02-08 25 views
49

Ruby'de tuples kullanan var mı? Eğer öyleyse, nasıl bir tuple uygulayabilir? Ruby hash'ları güzel ve neredeyse işe yarayacak, ama bakmak istediğiniz değeri bulmak için . notasyonunu kullanabileceğiniz Python'daki Tuple sınıfı gibi bir şey görmek isterim. Bunu istiyorum, böylece Python için Dee'a benzer bir D uygulaması yaratabileyim.Ruby'de Tuples Kullanımı?

+0

Hiç Ruby D uyguladınız mı? Eğer öyleyse, bunun bağlantısı var mı? Son zamanlarda benzer bir şey üzerinde çalışıyorum ve şimdiye kadar neler yaptığınızı görmek isterim. – dkubb

+1

Nope; Bu kadar uzağa gitmedim. Ona geri dönmeye çalışan başka şeylerin arasında dolanıyordum. Yardımcı olabilecekleri birkaç kütüphane buldum: LazyList and arel. Temelde .NET'deki LINQ'un neredeyse orada olduğu sonucuna vardım, sonra da yakın olan arel'i buldum. LazyList'i kullanarak ve doğrudan SQL'e dönüştürebilme, ki bunun da bir proje hedefi olması neredeyse sizi oraya götürecektir. Bu, şimdiye kadar sahip olduğunuz şeyi görmeyi çok isterim dedi. Hala geri dönmekten biraz uzaktayım. –

+0

hırs bir başka ilginç görünümlü kütüphanedir, ancak bir süre içinde güncellenmemiştir. İlk önce bulduğum şey buydu. arel aynı gelenekte devam etmiş gibi görünüyor. –

cevap

44

OpenStruct?

Kısa örnek: hash değerleri ve söz gerçeğine dayanarak

require 'ostruct' 

person = OpenStruct.new 
person.name = "John Smith" 
person.age  = 70 
person.pension = 300 

puts person.name  # -> "John Smith" 
puts person.age  # -> 70 
puts person.address # -> nil 
+0

Bu, tam olarak aradığım _exactly_. Teşekkürler! –

+2

np :) size soru cevaplamak için: hayır açık ya da başka olarak, ruby ​​içinde tuples kullanmayın. Ben yüksek ucunda sınıfları ve alt sonunda hashes kullanıyorum :) –

+9

bu bir zayıf cevap, sadece bir bağlantı? Ciddi anlamda? Bağlantı koptuğunda ne olur? –

25

. notasyon, (1. "a") sortinden farklı bir tür tuple demek istediğimi farz edeceğim. Muhtemelen Struct sınıfını arıyorsun. örneğin:

Person = Struct.new(:name, :age) 
me = Person.new 
me.name = "Guy" 
me.age = 30 
+0

Bu yakın, ama onu adlandırmak bana hata veriyor. Ben (1. "a") sıralama gibi bir şey arıyordum ama tanımladığınız özellik get/set notasyonu ile. –

+6

@panesofglass, hiçbir şeye gerek yok: a = Struct.new (: name,: age) .new; a.name = "Guy" – paradoja

+0

"a = Struct.new (: name,: age)" ve daha sonra a.new diyebilir miyim? Sanırım öyle olur. Bunu kontrol etmeliyim. İstediğime göre çok daha açık olurdu. –

9

bu (üyelerin Nokta gösterimini yapamaz), sık sık yakut pass-by olmanın sorunları çözecek bir listeden değişkenlerin listesini atayabilirsiniz kesinlikle tuple olmasa da bir geri dönüş değerleri listesinden geçtiğinizde değer.

E.g.

:linenum > (a,b,c) = [1,2,3] 
:linenum > a 
    => 1 
:linenum > b 
    => 2 
:linenum > c 
    => 3 
2

Sen Strüktür kırıcı ile benzer bir şey yapabilirim: beklendiği gibi bu 3 yazdırır

def something((a, b)) 
    a + b 
end 

p something([1, 2]) 

.

7

Ben Gem for Ruby tuples yazarım.

İki sınıfları ile sağlanır:

  • Tuple
  • Pair genel olarak belirli

farklı şekillerde onları başlatabilir:

Tuple.new(1, 2) 
Tuple.new([1, 2]) 
Tuple(1, 2) 
Tuple([1, 2]) 
Tuple[1, 2] 

Her iki sınıfların bazı yardımcı yöntemleri vardır:

  • length/arity - tuple
  • first/last/second (sadece çifti) içindeki değerler numarası verir - karşılık gelen elemanlar döner size özel elemanlarına bir erişim sağlar
  • []
0

Scala alaylarına bu numara ile alay edebilirsiniz:

Tuple = Struct.new(:_1, :_2) 

2.2.5 :003 > t = Tuple.new("a", "b") 
=> #<struct Tuple _1="a", _2="b"> 
2.2.5 :004 > t._1 
=> "a" 
2.2.5 :005 > t._2 
=> "b" 

ancak burada olamaz strüktür:

2.2.5 :012 > a, b = t 
=> {:_1=>"a", :_2=>"b"} 
2.2.5 :013 > a 
=> {:_1=>"a", :_2=>"b"} 
2.2.5 :014 > b 
=> nil 

Ama teşekkürler bu hile için: https://gist.github.com/stevecj/9ace6a70370f6d1a1511 strüktür çalışacaktır:

2.2.5 :001 > Tuple = Struct.new(:_1, :_2) 
=> Tuple 
2.2.5 :002 > t = Tuple.new("a", "b") 
=> #<struct Tuple _1="a", _2="b"> 
2.2.5 :003 > t._1 
=> "a" 
2.2.5 :004 > class Tuple ; def to_ary ; to_a ; end ; end 
=> :to_ary 
2.2.5 :005 > a, b = t 
=> #<struct Tuple _1="a", _2="b"> 
2.2.5 :006 > a 
=> "a" 
2.2.5 :007 > b 
=> "b"