72

有人在 Ruby 中使用元组吗?如果是这样,如何实现一个元组?Ruby 散列很好,而且工作起来几乎一样好,但我真的很想看到类似 Python 中的 Tuple 类的东西,您可以在其中使用.符号来查找您正在查找的值。我想要这个,以便我可以创建D的实现,类似于 Python 的Dee

4

7 回答 7

53

开放结构

简要示例:

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
于 2009-02-08T16:23:40.730 回答
32

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

Person = Struct.new(:name, :age)
me = Person.new
me.name = "Guy"
me.age =  30
于 2009-02-08T16:26:34.780 回答
18

虽然这不是严格意义上的元组(不能对成员进行点表示法),但您可以从列表中分配变量列表,这通常可以解决当您在列表之后 ruby​​ 是按值传递的问题返回值。

例如

:linenum > (a,b,c) = [1,2,3]
:linenum > a
  => 1
:linenum > b
  => 2
:linenum > c
  => 3
于 2014-04-30T02:13:40.530 回答
11

由于解构,数组用作元组很酷

a = [[1,2], [2,3], [3,4]]
a.map {|a,b| a+b }

结构为您提供方便的.访问器

Person = Struct.new(:first_name, :last_name)
ppl = Person.new('John', 'Connor')
ppl.first_name 
ppl.last_name

您可以通过以下方式获得两全其美的便利to_ary

Person = Struct.new(:first_name, :last_name) do
  def to_ary
    [first_name, last_name]
  end
end
# =>
[
  Person.new('John', 'Connor'), 
  Person.new('John', 'Conway')
].map { |a, b| a + ' ' + b  }
# => ["John Connor", "John Conway"]
于 2020-02-05T21:53:27.863 回答
10

我是Gem for Ruby tuples的作者。

为您提供两个课程:

  • Tuple一般来说
  • Pair尤其

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

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

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

  • length/ arity- 返回元组内的值的数量
  • first// last( secondonly pair) - 返回一个对应的元素
  • []这使您可以访问特定元素
于 2015-06-12T05:51:01.230 回答
8

你可以用这个技巧来模拟 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"
于 2016-12-06T15:14:31.300 回答
3

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

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

p something([1, 2])

3这按预期打印出来。

于 2015-05-26T09:07:40.950 回答