Кто-нибудь использует кортежи в Ruby? Если да, то как можно реализовать кортеж? Хэши Ruby хороши и работают почти так же хорошо, но мне бы очень хотелось увидеть что-то вроде класса Tuple в Python, где вы можете использовать нотацию .
, чтобы найти значение, которое вы ищете. Я хочу это, чтобы создать реализацию D, аналогично Dee для Python.
Используете кортежи в Ruby?
Ответы (7)
Краткий пример:
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
a = Struct.new(:name, :age)
, а позже сказать a.new? Я бы так предположил. Я должен это проверить. Было бы намного более ясно, чего я хочу.
- person ; 27.07.2010
Person.new("Guy", 30)
действительно работает в дополнение к настройке полей по отдельности.
- person Greg Haskins; 29.04.2014
Хотя это не строго кортеж (нельзя использовать точечную нотацию членов), вы можете назначить список переменных из списка, что часто решает проблемы с передачей ruby по значению, когда вы следуете за списком возвращаемые значения.
E.g.
:linenum > (a,b,c) = [1,2,3]
:linenum > a
=> 1
:linenum > b
=> 2
:linenum > c
=> 3
Я автор 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
/second
(только пара) - возвращает соответствующие элементы[]
, который дает вам доступ к определенным элементам
Массивы круто использовать в качестве кортежей из-за деструктуризации
a = [[1,2], [2,3], [3,4]]
a.map {|a,b| a+b }
Struct предоставляет вам удобные .
средства доступа
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"]
Вы можете издеваться над кортежами 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"
Struct.new
, например, ghostbin.com/ paste / vwtg6
- person dynsne; 10.06.2018
Вы можете сделать что-то похожее на деструктуризацию:
def something((a, b))
a + b
end
p something([1, 2])
Это распечатает 3
, как и ожидалось.