Использование кортежей в Ruby?
кто-нибудь использует кортежи в Ruby? Если да, то как можно осуществить запись? Рубиновые хэши хороши и работают почти так же хорошо, но я бы очень хотел увидеть что-то вроде класса кортежей в Python, где вы можете использовать .
нотации, чтобы найти значение, которое вы ищете. Я хочу этого, чтобы я мог создать реализацию D, как Ди для Python.
6 ответов
пример:
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")
сортировка. Вы, вероятно, ищете Struct
класса. например:
Person = Struct.new(:name, :age)
me = Person.new
me.name = "Guy"
me.age = 30
хотя это не строго кортеж (не может делать точечную нотацию членов), вы можете назначить список переменных из списка, который часто будет решать проблемы с ruby, когда вы находитесь после списка возвращаемых значений.
Е. Г.
:linenum > (a,b,c) = [1,2,3]
:linenum > a
=> 1
:linenum > b
=> 2
:linenum > c
=> 3
Я автор книги драгоценный камень для рубиновых кортежей.
вам предоставляются два класса:
-
Tuple
В общем -
Pair
в частности
вы можете инициализировать их по-разному:
Tuple.new(1, 2)
Tuple.new([1, 2])
Tuple(1, 2)
Tuple([1, 2])
Tuple[1, 2]
оба класса имеют некоторые вспомогательные методы:
-
length
/arity
- возвращает количество значений внутри кортежа!--17--> -
first
/last
/second
(только пара) - который возвращает соответствующие элементы -
[]
это дает вам доступ к определенным элементам
вы можете издеваться над кортежами 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"
вы можете сделать что-то похожее с destructuring:
def something((a, b))
a + b
end
p something([1, 2])
это выводит 3
как ожидается.