gpt4 book ai didi

ruby-on-rails - 在 class_eval block 或 instance_eval block 中定义的 Rails 作用域?

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:06 25 4
gpt4 key购买 nike

我对 this 有点困惑文档中关于 ActiveSupport::Concern 的示例:

module M
def self.included(base)
base.extend ClassMethods
base.class_eval do
scope :disabled, -> { where(disabled: true) }
end
end

module ClassMethods
...
end
end

self.included 当您在类中包含或扩展模块时调用模块。 base 指的是对象,无论是类对象还是对象实例。 base 上的extend 将模块中的方法作为base 上的单例方法包含在内。 include 会将方法添加到类对象的实例中。

但是,class_eval 也用于将实例方法添加到类对象的实例中。然而,scope 是一个类方法:

Adds a class method for retrieving and querying objects.

既然 scope 是一个类方法,为什么这个例子使用 class_eval 而不是 instance_eval

最佳答案

class_evalinstance_eval 更强大。

使用类 eval,您可以在类的上下文中评估代码,允许您定义和调用类方法、实例方法等:

Greeter = Class.new

Greeter.class_eval do
def self.friendly?
true
end

def say_hi
"Howdy!"
end
end

donato = Greeter.new
donato.say_hi # => "Howdy!"
Greeter.friendly? # => true

instance_eval 而是以目标实例作为接收者来评估代码,因此如果您尝试定义实例方法,则必须更加狡猾:

Greeter = Class.new

Greeter.instance_eval do
def friendly?
true
end

define_method(:say_hi) { "Howdy!" }
end

donato = Greeter.new
donato.say_hi # => "Howdy!"

关于ruby-on-rails - 在 class_eval block 或 instance_eval block 中定义的 Rails 作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41248760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com