문제

누구든지 루비에서 튜플을 사용합니까? 그렇다면 어떻게 튜플을 구현할 수 있습니까? Ruby Hashes는 훌륭하고 거의 작동하지만 Python의 Tuple Class와 같은 것을 정말로보고 싶습니다. . 당신이보고있는 값을 찾기위한 표기법. 나는 이것을 원한다. , 비슷하다 파이썬의 경우.

도움이 되었습니까?

해결책

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") 종류. 당신은 아마도 Struct 수업. 예 :

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

이것은 엄격하게 튜플이 아니지만 (멤버의 도트 표기법을 수행 할 수 없음) 목록에서 변수 목록을 할당 할 수 있습니다. 이는 종종 루비가 통과 할 때 값이 부과되는 문제를 해결할 수 있습니다. 반환 값.

예를 들어

: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 - 튜플 내부의 값 수를 반환합니다
  • first / last / second (쌍 만) - 해당 요소를 반환합니다.
  • [] 그것은 당신에게 특정 요소에 대한 액세스를 제공합니다

이 트릭으로 스칼라 튜플을 조롱 할 수 있습니다.

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"

파괴와 비슷한 일을 할 수 있습니다.

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

p something([1, 2])

이것은 인쇄합니다 3 예상대로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top