Ruby에서 구조체란 무엇입니까?
구조체는 기본 제공 Ruby 클래스이며 값 개체를 생성하는 새 클래스를 만드는 데 사용됩니다. 값 개체는 관련 속성을 함께 저장하는 데 사용됩니다.
예시 :
Point
두 좌표(x
&y
).
이 데이터를 다양한 방식으로 나타낼 수 있습니다.
좋아요 :
- 배열
[10, 20]
- 해시
{ x: 10, y: 10 }
- 객체
Point.new(10, 20)
Point
가 두 개 이상인 경우 , 객체 접근 방식을 사용하는 것이 좋습니다.
하지만...
이 두 값을 함께 저장하기 위해 전체 클래스를 만들고 싶지는 않습니다!
Struct
사용 이 문제를 해결합니다.
내용
- 1 Ruby에서 구조체를 만드는 방법
- 1.1 대체 방법
- 1.2 큰 이점
- 2 Ruby 구조체를 사용하는 방법
- 3 경고:구조체는 까다로울 수 있음
- 3.1 또 다른 이상한 점
- Ruby 2.5의 4가지 명명된 매개변수
- 5 OpenStruct 사용 방법
- 6 Struct 대 OpenStruct
- 7 동영상 튜토리얼 보기
- 8 결론
- 8.1 관련
해보자!
Ruby에서 구조체를 만드는 방법
Struct
를 만들 수 있습니다. new
를 호출하여 &이 클래스의 인스턴스 변수가 될 기호 목록을 전달합니다.
읽기 및 쓰기 모두에 대해 기본적으로 정의된 접근자 메서드가 있습니다.
예시 :
Person = Struct.new(:name, :age, :gender)
이제 이와 같은 개체를 만들 수 있습니다. :
john = Person.new "john", 30, "M" david = Person.new "david", 25, "M"
대체 방법
야생에서 구조체를 만드는 다른 방법을 찾을 수 있습니다.
이렇게 생겼어요 :
class Person < Struct.new(:name, :age, :gender) end
추천하지 않습니다.
하지만 지금 찾으면 그것이 무엇을 하는지 알 수 있습니다.
큰 이점
속성을 기반으로 직접 비교할 수 있다면 구조체의 좋은 점입니다.
예 :
john == john # true
이것이 일반 Ruby 객체라면 ==
를 정의해야 합니다. 방법.
이것을 "가치 개체"라고 합니다.
루비 구조체를 사용하는 방법
배열 또는 해시를 통해 구조체를 사용하는 주요 이점 중 하나는 메서드를 사용하여 구조체 멤버에 액세스할 수 있다는 것입니다.
예를 들어 :
puts john.age # 30 puts david.gender # "M"
이것은 객체 배열이 있는 경우 max
와 같은 메서드를 사용할 수 있기 때문에 유용합니다. , select
, sum
등
예 :
[john, david].max_by(&:age)
좋아요!
경고:구조체는 까다로울 수 있습니다
구조체 생성 클래스의 또 다른 주의 사항은...
생성자에 대한 올바른 수의 인수를 적용하지 않습니다.
설명하겠습니다.
적절한 클래스를 사용하면 다음 오류가 표시됩니다.
ArgumentError: wrong number of arguments (0 for 3)
그러나 Struct
를 사용하는 경우 누락된 인수는 nil이 됩니다.
Person.new("peter") # struct Person name="peter", age=nil, gender=nil
Struct
로 작업할 때 이 점을 염두에 두십시오. 개체!
또 다른 이상한 점
이것 좀 보세요...
Struct.new(:a).ancestors [#<Class:0x29b1040>, Struct, Enumerable, Object, Kernel, BasicObject]
이 #<Class:0x29b1040>
구조체에 추가된 익명 클래스이며, 각 &map과 같은 메서드를 호출할 수 있는 열거 가능한 모듈도 주목하세요.
Ruby 2.5의 명명된 매개변수
파일에서 한 줄을 읽고 있고 각 줄은 하나의 항목을 나타낸다고 가정해 보겠습니다.
예 :
200 /login 18:00 404 /bacon 18:03 200 /books 18:04
맞춤 수업을 만들면 이 데이터로 더 쉽게 작업할 수 있습니다.
좋아요 :
LogEntry = Struct.new(:status, :url, :time) LogEntry.new(200, '/books', '18:04')
그러나 모든 인수가 나타내는 것을 더욱 명확하게 하려면 키워드 인수를 사용하는 것이 좋습니다.
좋은 소식입니다!
Ruby 2.5는 Struct
에서 키워드 인수에 대한 지원을 추가했습니다. 개체.
사용 방법은 다음과 같습니다. :
LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04')
이제 파일을 구문 분석하고 LogEntry
로 변환할 수 있습니다. 개체!
OpenStruct 사용 방법
일회용 개체가 필요한 경우 OpenStruct
사용을 고려해야 합니다. 대신.
코드 예 :
require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color
ostruct
가 어떻게 필요한지 확인하세요. 이 수업에 액세스할 수 있습니다.
경고:이 reddit 주석의 schneems에 따르면 OpenStruct는 느리므로 프로덕션 앱에서 사용해서는 안 됩니다. 또한 이를 지원하는 몇 가지 벤치마크가 있는 이 블로그 게시물을 찾았습니다.
Struct 대 OpenStruct
Struct
의 차이점 &OpenStruct
:
- Struct는 새 클래스를 생성합니다. 사전 정의된 속성, 동등 방법(==) 및 열거 가능
- OpenStruct는 새 개체를 생성합니다. 주어진 속성으로
OpenStruct
Struct
는 멋진 Hash 객체이지만 템플릿에서 새 클래스를 만드는 것과 같습니다.
동영상 튜토리얼 보기
결론
Ruby Struct 및 OpenStruct에 대해 배웠습니다! 이러한 각 클래스의 특별한 특성을 알고 있는 한 괜찮습니다.
이제 당신이 연습할 차례입니다 🙂