2017-12-11 19 views
2

우리는 Sequel gem을 사용하여 데이터 소스에 연결하고, 약간의 작업을 수행 한 다음, 해당 객체의 singleton_class에 첨부 된 여러 가지 편리한 메소드가있는 결과를 반환합니다.왜 singleton_class 객체는 Ruby 2.4에서는 고정되었지만 2.3에서는 고정되지 않은 이유는 무엇입니까?

result = EpulseDB::Employee.where(normalized_args) 
result.singleton_class.include(EpulseNormalization) 

을 그리고 우리는 singleton_class 냉동없는 루비 2.3.4를 사용하여 볼 수 있습니다 : 루비 2.3,이 코드는 예상대로 작동

[1] pry(main)> result = EpulseDB::Employee.where(employee_id: 2) 
=> #<Sequel::Postgres::Dataset: "SELECT * FROM \"employee\" WHERE (\"employee_id\" = 2)"> 
[2] pry(main)> result.frozen? 
=> true 
[3] pry(main)> result.singleton_class.frozen? 
=> false 
[4] pry(main)> result.singleton_class.include(EpulseNormalization) 
=> #<Class:#<Sequel::Postgres::Dataset:0x007feff0903660>> 

그러나 루비 2.4.2에서이 singleton_class 나타납니다 동결 상태로 반환되며 더 이상 연장 할 수 없습니다. 내가 사용해야하는 싱글 톤을 확장하는 새로운 방법이 있습니까 ??

[1] pry(main)> result = EpulseDB::Employee.where(employee_id: 2) 
=> #<Sequel::Postgres::Dataset: "SELECT * FROM \"employee\" WHERE (\"employee_id\" = 2)"> 
[2] pry(main)> result.frozen? 
=> true 
[3] pry(main)> result.singleton_class.frozen? 
=> true 
[4] pry(main)> result.singleton_class.include(EpulseNormalization) 
RuntimeError: can't modify frozen object 
from (pry):4:in `append_features' 
+0

를이는 루비가이 일을 처리하는 방법의 변화가 될 수 속편의 동일한 버전 인 경우. – tadman

+0

정확히 - Ruby 2.3.4에서 2.4.2 로의 전환을 제외하고는 아무 것도 바뀌지 않습니다. 나는 RVM을 사용하고 그들 사이를 전환한다. – DaKaZ

+1

2.4에서 수정 된 Ruby 2.3의 버그처럼 보입니다. –

답변

2

사용 Dataset#with_extend 대신 데이터 세트 자체를 수정하는 Dataset#extend를 호출하는 모듈로 확장 된 데이터 세트의 수정 된 사본을 반환합니다. 이것은 Sequel이 지원하는 모든 버전의 루비에서 작동합니다.

Backstory : Ruby 자체와 관련이 없으며, Ruby < 2.4의 기능 부족에 대한 Sequel의 해결 방법 때문입니다.

Ruby < 2.4에서는 Object#clone이 고정 된 개체의 수정 된 복사본 (개체의 단독 개체 복사본 포함)을 만드는 데 사용되는 경우를 처리 할 수 ​​없습니다. Ruby 2.4는 freeze: false 옵션을 Object#clone에 추가하여 싱글 톤 클래스 (https://bugs.ruby-lang.org/issues/12300 참조)를 포함하는 고정 된 개체의 수정 된 복사본을 만들 수있었습니다.

Sequel :: Dataset은 내부적으로 #clone을 사용하여 수정 된 데이터 집합을 반환하며, 데이터 집합에는 적절한 기능을 수행하는 데 사용되는 단일 클래스의 복사본이 포함되어 있어야합니다. Sequel :: Dataset이 고정되기를 원했기 때문에 여전히 루비 < 2.4에서 작동합니다. 기본적으로 루비에 고정되어 있습니다. < 2.4. 루비 2.4에서만 진정으로 얼어 붙었습니다. 참조 :

+0

여기에 모든 세부 사항을 주셔서 감사합니다.'with_extend' 메쏘드는 꼭 필요한 것입니다! – DaKaZ