- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我们有一个应用程序使用 Sequel gem 连接到数据源,执行一些工作,然后返回一个结果,该结果具有许多附加到该对象的 singleton_class
的便捷方法。在 ruby 2.3 中,此代码按预期工作:
result = EpulseDB::Employee.where(normalized_args)
result.singleton_class.include(EpulseNormalization)
我们可以看到使用 ruby 2.3.4 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?
=> false
[4] pry(main)> result.singleton_class.include(EpulseNormalization)
=> #<Class:#<Sequel::Postgres::Dataset:0x007feff0903660>>
但在 Ruby 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'
最佳答案
使用 Dataset#with_extend
返回使用模块扩展的数据集的修改副本,而不是调用 Dataset#extend
来修改数据集本身。这适用于 Sequel 支持的所有 ruby 版本。
背景:这与 Ruby 本身无关,这是由于 Sequel 中针对 Ruby <2.4 中缺少功能的解决方法。
在 Ruby <2.4 中,Object#freeze
无法处理 Object#clone
用于创建卡住对象的修改副本(包括对象的单例副本)的情况类(class))。 Ruby 2.4 向 Object#clone
添加了 freeze: false
选项,以允许创建卡住对象的修改副本,包括它们的单例类(参见 https://bugs.ruby-lang.org/issues/12300 )。
Sequel::Dataset 在内部使用 #clone
来返回修改后的数据集,并且要求数据集包含用于正常运行的任何单例类的副本。因为我希望 Sequel::Dataset 被卡住,但仍然在 ruby < 2.4 上工作,所以它基本上假装在 ruby <2.4 上被卡住。它只在 ruby 2.4 中真正卡住。见:
关于ruby - 为什么 singleton_class 对象在 Ruby 2.4 而不是在 2.3 中卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47760253/
class Product < ActiveRecord::Base set_table_name 'produce' end module ActiveRecord class Base
我在元类中定义了方法specific_data1和specific_data2,并期望这些方法属于单例类: class User def User.specific_data1 "user
Module#singleton_class 的逆运算是什么?即,给定一个单例类,我怎样才能得到它是单例的模块? 最佳答案 您可以使用 ObjectSpace#each_object为此: modul
当我向 singleton_class 添加验证时,它似乎被分配给了基类,并且它不会触发任何一个。 class Example attr_accessor :title, :some_boolea
为什么 Foo.val 在调用 Foo.set 之前返回 nil 而不是 "foo"? 是否有任何机制可以在类评估时初始化 @val? @val = "foo" 存储在哪个范围内? class Foo
假设有人希望创建一个具有类实例变量、该变量的 getter、类方法和实例方法的类。人们可能会写下以下内容。 class C @v = 1 def hi 'hi' end cla
我这样做有什么区别 class T def initialize self.class.class_eval do def test return self.cl
我们有一个应用程序使用 Sequel gem 连接到数据源,执行一些工作,然后返回一个结果,该结果具有许多附加到该对象的 singleton_class 的便捷方法。在 ruby 2.3 中,此代
根据定义,一个对象的单例类也继承了该对象父类(super class)的单例类。 ruby 中的 BasicObject 没有任何父类(super class),因为它是最基本的级别类 >> Basi
我是一名优秀的程序员,十分优秀!