Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 Struct 및 OpenStruct를 사용하는 방법

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에 대해 배웠습니다! 이러한 각 클래스의 특별한 특성을 알고 있는 한 괜찮습니다.

Ruby에서 Struct 및 OpenStruct를 사용하는 방법

이제 당신이 연습할 차례입니다 🙂