우리는 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'
를이는 루비가이 일을 처리하는 방법의 변화가 될 수 속편의 동일한 버전 인 경우. – tadman
정확히 - Ruby 2.3.4에서 2.4.2 로의 전환을 제외하고는 아무 것도 바뀌지 않습니다. 나는 RVM을 사용하고 그들 사이를 전환한다. – DaKaZ
2.4에서 수정 된 Ruby 2.3의 버그처럼 보입니다. –