Ruby 3 - 익명 구조체
NOTE: This change was not implemented in Ruby 3
많은 게시물 중 첫 번째로 시작하여 최근에 있었던 Anonymous Struct 구문discussed on the bug tracker을 살펴보겠습니다.
빠른 참조
그래서 그것은 무엇을합니까? 거의 OpenStruct처럼 Structs를 인라인으로 만들 수 있습니다.
bob = ${ name: 'Bob', age: 42 }
sue = ${ name: 'Sue', age: 42 }
대신 OpenStruct를 사용하면 다음과 같이 보일 수 있습니다.
bob = OpenStruct.new(name: 'Bob', age: 42)
sue = OpenStruct.new(name: 'Sue', age: 42)
세부
살펴보겠습니다.
무엇을 위해 사용할 수 있습니까?
나머지 부분을 살펴보기 전에 재미있는 부분부터 시작하겠습니다. 이 중 일부는 즉시 실험할 수 없기 때문에 잘 작동할지 알 수 없다는 점에서 주의할 것입니다.
패턴 매칭
이것이 작동한다면 나는 매우 행복한 프로그래머가 될 것입니다.
bob = Person.new(name: 'Bob', age: 42)
case bob
in ${ name: /^B/, age: 20..50 }
true
else
false
end
공정하게 말할 수 있는 동안:
case bob
in Person[name: /^B/, age: 20..50]
true
else
false
end
...대신 속성 집합에 대한 덕 타이핑의 가능성을 좋아합니다.
중첩된 객체 유형에 대해 알아보기 시작하면 이것이 정말 흥미롭고 빠르게 얻을 수 있는 위치를 알 수 있습니다.
구조화
패턴 일치를 사용하면 객체에서 키를 분해하는 데 사용할 수 있는 매우 멋진Struct#deconstruct_keys도 얻을 수 있습니다.
Object
자체에는 이러한 동작이 없기 때문에 여기에서 다음과 같이 할 수 있는 것과 동일한 재미를 얻을 수 없습니다.
case ${ name: 'Bob', age: 42 }
in name: /^B/
end
...이를 통해 일부 중간 구문을 건너뛸 수 있습니다.
디버깅 / 테스트
특정 메소드에 응답하기 위해 double
와 같은 것을 사용하거나 가짜 객체를 몇 번이나 사용해야합니까? 이 새로운 구문을 사용하면 인라인 모의 객체를 메서드에 제공하는 정말 빠른 방법을 사용할 수 있습니다.
def some_expecting_method(object)
Rails.logger.info "#{object.name}: #{object.value} is interesting"
end
some_expecting_method(${ name: 'something', value: 'interesting' })
과거에 내가 확실히 OpenStruct
및 내 자신의 빠른 Struct
해킹을 사용했기 때문에 모든 유형의 spelunking 및 디버깅 모험에 유용할 것입니다.
그렇다면 왜 OpenStruct가 안될까요?
조금 느려지기 때문입니다. 버그 추적기에서:
BTW, OpenStruct (os.a) is slow.
Comparison:
hs[:a]: 92835317.7 i/s
ob.a: 85865849.5 i/s - 1.08x slower
st.a: 53480417.5 i/s - 1.74x slower
os.a: 12541267.7 i/s - 7.40x slower
튀기다
이 기능은 해시 스플래팅을 명시적으로 금지합니다.
# Works
a = { a: 1, b: 2 }
b = { **a, c: 3 }
# Does not work
c = ${ **b, d: 4 }
주어진 추론은 사용자가 잠재적으로 보안 문제를 일으키는 잘못된 해시를 입력할 수 있다는 것입니다.
경고
그러한 기능에 가치가 있을 수 있고 언어가 사용자가 그러한 일을 하는 것을 방지하려고 해서는 안 되므로 이에 대해 반드시 동의한다고 말할 수는 없습니다. 이 경우 우리는 오래 전에 eval
및 기타 구성을 잠갔을 것입니다.
나는 포맷터가 어떤 경우에는 좋은 생각이 아니라고 경고하지만 동의하지 않는 기능을 방지하는 데 동의합니다.
KWArg 구문 및 기타 대안 차단
Matz는 다음 구문에 대해 생각했다고 언급되었습니다.
{ |a: 1, b: 2| }
이것은 블록과 혼동을 일으킬 수 있습니다noted by another commenter.
다른 논의된 구문은 다음과 같습니다.
# 1. Original
${a:1, b:2}
# 2. Matz's idea, conflicts with blocks
{|a:1, b:2|}
# 3. New Struct keyword, could introduce incompatibilities
struct a: 1, b: 2
# 4. %o for Object
%o{a:1, b:2}
# 5. Use parens
(a:1, b:2)
# 6. Methods on Struct or references to other class behavior
Struct.anonymous(a:1, b:2)
# 6.2 Kernel Struct method
Struct(a:1, b:2)
# 6.3 Struct#[] method, like Hash[a: 1]
Struct[a:1, b:2]
개인적으로 Ruby의 다른 클래스에서 많은 동작과 함께 6.3을 정말 좋아하지만 간결함을 위해 ${}
에 대한 편견이 있습니다.
이별의 생각
이 기능 아이디어가 정말 마음에 들고 위의 몇 가지 이유로 내 코드에서 많이 사용할 것입니다. 명명된 클래스가 더 쉽게 문서화되고 설명되기 때문에 디버깅 외부의 프로덕션 코드에서 너무 자유롭게 사용하지 않도록 주의하겠습니다.
Ruby 3.0이 무엇을 가져올지 기대하며 새로운 기능을 보는 대로 작성하겠습니다.
내가 하지 않은 것을 알아차리셨나요? 트위터 DM 주시면 검토해 보도록 하겠습니다.
참고: 현재 Rector 포스트에서 작업 중이지만 먼저 더 많은 연구를 하고 싶습니다.
다음 시간까지!
Reference
이 문제에 관하여(Ruby 3 - 익명 구조체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/baweaver/ruby-3-anonymous-struct-51n0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
bob = ${ name: 'Bob', age: 42 }
sue = ${ name: 'Sue', age: 42 }
bob = OpenStruct.new(name: 'Bob', age: 42)
sue = OpenStruct.new(name: 'Sue', age: 42)
살펴보겠습니다.
무엇을 위해 사용할 수 있습니까?
나머지 부분을 살펴보기 전에 재미있는 부분부터 시작하겠습니다. 이 중 일부는 즉시 실험할 수 없기 때문에 잘 작동할지 알 수 없다는 점에서 주의할 것입니다.
패턴 매칭
이것이 작동한다면 나는 매우 행복한 프로그래머가 될 것입니다.
bob = Person.new(name: 'Bob', age: 42)
case bob
in ${ name: /^B/, age: 20..50 }
true
else
false
end
공정하게 말할 수 있는 동안:
case bob
in Person[name: /^B/, age: 20..50]
true
else
false
end
...대신 속성 집합에 대한 덕 타이핑의 가능성을 좋아합니다.
중첩된 객체 유형에 대해 알아보기 시작하면 이것이 정말 흥미롭고 빠르게 얻을 수 있는 위치를 알 수 있습니다.
구조화
패턴 일치를 사용하면 객체에서 키를 분해하는 데 사용할 수 있는 매우 멋진Struct#deconstruct_keys도 얻을 수 있습니다.
Object
자체에는 이러한 동작이 없기 때문에 여기에서 다음과 같이 할 수 있는 것과 동일한 재미를 얻을 수 없습니다.case ${ name: 'Bob', age: 42 }
in name: /^B/
end
...이를 통해 일부 중간 구문을 건너뛸 수 있습니다.
디버깅 / 테스트
특정 메소드에 응답하기 위해
double
와 같은 것을 사용하거나 가짜 객체를 몇 번이나 사용해야합니까? 이 새로운 구문을 사용하면 인라인 모의 객체를 메서드에 제공하는 정말 빠른 방법을 사용할 수 있습니다.def some_expecting_method(object)
Rails.logger.info "#{object.name}: #{object.value} is interesting"
end
some_expecting_method(${ name: 'something', value: 'interesting' })
과거에 내가 확실히
OpenStruct
및 내 자신의 빠른 Struct
해킹을 사용했기 때문에 모든 유형의 spelunking 및 디버깅 모험에 유용할 것입니다.그렇다면 왜 OpenStruct가 안될까요?
조금 느려지기 때문입니다. 버그 추적기에서:
BTW, OpenStruct (os.a) is slow.
Comparison:
hs[:a]: 92835317.7 i/s
ob.a: 85865849.5 i/s - 1.08x slower
st.a: 53480417.5 i/s - 1.74x slower
os.a: 12541267.7 i/s - 7.40x slower
튀기다
이 기능은 해시 스플래팅을 명시적으로 금지합니다.
# Works
a = { a: 1, b: 2 }
b = { **a, c: 3 }
# Does not work
c = ${ **b, d: 4 }
주어진 추론은 사용자가 잠재적으로 보안 문제를 일으키는 잘못된 해시를 입력할 수 있다는 것입니다.
경고
그러한 기능에 가치가 있을 수 있고 언어가 사용자가 그러한 일을 하는 것을 방지하려고 해서는 안 되므로 이에 대해 반드시 동의한다고 말할 수는 없습니다. 이 경우 우리는 오래 전에
eval
및 기타 구성을 잠갔을 것입니다.나는 포맷터가 어떤 경우에는 좋은 생각이 아니라고 경고하지만 동의하지 않는 기능을 방지하는 데 동의합니다.
KWArg 구문 및 기타 대안 차단
Matz는 다음 구문에 대해 생각했다고 언급되었습니다.
{ |a: 1, b: 2| }
이것은 블록과 혼동을 일으킬 수 있습니다noted by another commenter.
다른 논의된 구문은 다음과 같습니다.
# 1. Original
${a:1, b:2}
# 2. Matz's idea, conflicts with blocks
{|a:1, b:2|}
# 3. New Struct keyword, could introduce incompatibilities
struct a: 1, b: 2
# 4. %o for Object
%o{a:1, b:2}
# 5. Use parens
(a:1, b:2)
# 6. Methods on Struct or references to other class behavior
Struct.anonymous(a:1, b:2)
# 6.2 Kernel Struct method
Struct(a:1, b:2)
# 6.3 Struct#[] method, like Hash[a: 1]
Struct[a:1, b:2]
개인적으로 Ruby의 다른 클래스에서 많은 동작과 함께 6.3을 정말 좋아하지만 간결함을 위해
${}
에 대한 편견이 있습니다.이별의 생각
이 기능 아이디어가 정말 마음에 들고 위의 몇 가지 이유로 내 코드에서 많이 사용할 것입니다. 명명된 클래스가 더 쉽게 문서화되고 설명되기 때문에 디버깅 외부의 프로덕션 코드에서 너무 자유롭게 사용하지 않도록 주의하겠습니다.
Ruby 3.0이 무엇을 가져올지 기대하며 새로운 기능을 보는 대로 작성하겠습니다.
내가 하지 않은 것을 알아차리셨나요? 트위터 DM 주시면 검토해 보도록 하겠습니다.
참고: 현재 Rector 포스트에서 작업 중이지만 먼저 더 많은 연구를 하고 싶습니다.
다음 시간까지!
Reference
이 문제에 관하여(Ruby 3 - 익명 구조체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/baweaver/ruby-3-anonymous-struct-51n0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Ruby 3 - 익명 구조체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/baweaver/ruby-3-anonymous-struct-51n0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)