在Ruby中使用元组?

有没有人在Ruby中使用元组? 如果是这样,怎么可能实现一个元组? Ruby哈希很好,工作也差不多,但是我真的很想看到像Python中的Tuple类,你可以使用它. 记法来find你正在寻找的价值。 我想要这个,所以我可以创build一个D的实现,类似于Python的Dee 。

OpenStruct ?

简单的例子:

 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 

基于你谈论哈希和。 符号我将假设你的意思是不同于(1. "a")types的元组。 您可能正在寻找Struct类。 例如:

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

虽然这不是严格的元组(不能做成员的点符号),但是你可以从列表中分配一个variables列表,当你在列表后面的时候,通常会解决ruby被传递的问题。返回值。

例如

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

我是Ruby元组的gem的作者。

你有两个课程:

  • 一般的Tuple
  • Pair特别

你可以用不同的方式初始化它们:

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

这两个类都有一些辅助方法:

  • length / arity – 返回元组内值的个数
  • first / last / second (只有一对) – 它返回一个相应的元素
  • [] ,让您访问特定的元素

你可以做类似解构的事情:

 def something((a, b)) a + b end p something([1, 2]) 

如预期的那样打印出3

你可以用这个技巧来嘲笑Scala元组:

 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" 

但在这里你不能解构:

 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 

但由于这个技巧: https : //gist.github.com/stevecj/9ace6a70370f6d1a1511解构将工作:

 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"