gpt4 book ai didi

ruby - 使用 class_eval 创建方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:00:44 25 4
gpt4 key购买 nike

我想写一个方法,它接受一个参数并创建另一个方法,用这个参数命名。这是我的代码

class Class
def createMethod(attr_name)
attr_name = attr_name.to_s
class_eval %Q{
def #{attr_name}
puts "bar"
end
}
end
end

p Class.new.createMethod("foo").respond_to?(:foo)

不幸的是,respond_to?(:foo) 的计算结果为 false。怎么了?

最佳答案

这是因为 class_eval 是一个类方法,您在实例的上下文中调用它。您可以这样做:

class Class
def createMethod(attr_name)
attr_name = attr_name.to_s
self.class.class_eval %Q{
def #{attr_name}
puts "bar"
end
}
self # Return yourself if you want to allow chaining methods
end
end

这是执行此操作时 irb 的输出:

irb(main):001:0> class Class
irb(main):002:1> def createMethod(attr_name)
irb(main):003:2> attr_name = attr_name.to_s
irb(main):004:2> self.class.class_eval %Q{
irb(main):005:2" def #{attr_name}
irb(main):006:2" puts "bar"
irb(main):007:2" end
irb(main):008:2" }
irb(main):009:2> end
irb(main):010:1> end
=> nil
irb(main):011:0> clazz = Class.new
=> #<Class:0x007fd86495cd58>
irb(main):012:0> clazz.respond_to?(:foo)
=> false
irb(main):013:0> clazz.createMethod("foo")
=> nil
irb(main):014:0> clazz.respond_to?(:foo)
=> true

关于ruby - 使用 class_eval 创建方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14426100/

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