gpt4 book ai didi

ruby-on-rails - Ruby:为什么实例评估类创建实例方法而不是类方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:28 24 4
gpt4 key购买 nike

我想动态创建类方法test,为此我在instance_eval 中使用define_method 方法。我期待下面的代码创建类方法 test 但代码创建实例方法 test。这可能是什么原因?下面是我的代码。

module Accessor
def define_accessor_for_class(method)
self.instance_eval do
define_method :test do
end
end
end
end




class Employee
extend Accessor
define_accessor_for_class :name
end


Employee.name = "sanjay"
Employee.name

Employee.instance_methods(false) ==> [:test]
Employee.methods(false) => []

最佳答案

instance_eval 更改 self,即实例变量和无接收器消息发送的动态上下文。它不会改变 default definee ,即非限定方法定义的动态上下文。

在您的情况下,由于您的方法定义没有任何内容是动态的,因此根本没有理由使用动态元编程,您可以只使用限定的方法定义:

module Accessor
def define_accessor_for_class(method)
def self.test; end
end
end

class Employee
extend Accessor
define_accessor_for_class :name
end

Employee.instance_methods(false) #=> []
Employee.methods(false) #=> [:test]

如果出于某种原因,你需要活力,你可以使用Object#define_singleton_method相反:

module Accessor
def define_accessor_for_class(method)
define_singleton_method(:test) do end
end
end

class Employee
extend Accessor
define_accessor_for_class :name
end

Employee.instance_methods(false) #=> []
Employee.methods(false) #=> [:test]

关于ruby-on-rails - Ruby:为什么实例评估类创建实例方法而不是类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191489/

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