gpt4 book ai didi

ruby - 类中的产量 << 类方法中的 self

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

我想创建一个类方法,它接受一组方法定义并将其注入(inject)到类中。现在,self确实是 Tom对象所以class << self打开它,但是 yield似乎不起作用。我的理论知识不是那么深,所以我不确定为什么这不起作用。我可能完全错了,所以请随意讨论替代方案。

class Tom < Person
mega_methods do
def hiya!
puts 'hiYA!'
end
end
end

class Person
def self.mega_methods
...
class << self
yield
end
end
end

Tom.hiya!

我知道我可以在 Tom 中定义方法使用 class << self或者我可以包括 class << self在 block 中。

我也想到了这个替代方案:

def self.mega_methods &block
if block_given?
extension = Module.new(&Proc.new)
self.extend(extension)
end
end

这个问题更多的是帮助我理解 Ruby 的工作原理,而不是解决一个特定的问题。

最佳答案

这有点奇怪,但如果您正在探索 Ruby,那没关系。

class Person
puts "evaluating Person's body ..."
def self.mega_methods
puts 'in Person#self.mega_methods, about to yield ...'
yield
end
end

class Tom < Person
puts "evaluating Tom's body ..."
print 'Tom.singleton_methods : '; p Tom.singleton_methods
mega_methods do
puts 'in Tom, about to define self.hiya!'
def self.hiya!
puts 'hiYA!'
end
end
print 'Tom.singleton_methods : '; p Tom.singleton_methods
end

Tom.hiya!

执行:

$ ruby -w t.rb 
evaluating Person's body ...
evaluating Tom's body ...
Tom.singleton_methods : ["mega_methods"]
in Person#self.mega_methods, about to yield ...
in Tom, about to define self.hiya!
Tom.singleton_methods : ["mega_methods", "hiya!"]
hiYA!

请注意,按照惯例,方法名称中的感叹号保留用于销毁方法,例如 String#sub! 会修改接收者字符串。

另见 What does def `self.function` name mean?

一切都是为了自己!

class Person2
def self.mega_methods
print 'in Person2 self='; p self
class << self
print 'in class << self self='; p self
yield
end
end
end

class Tom2 < Person2
mega_methods do
puts "in Tom2, about to define self.hiya! for self=#{self}"
def self.hiya!
puts 'hiYA!'
end
def hi
puts 'hi'
end
end
end

print 'Tom2.singleton_methods : '; p Tom2.singleton_methods
print 'Tom2.instance_methods : '; p Tom2.instance_methods(false)
Tom2.hiya!
Tom2.new.hi

执行:

$ ruby -w t2.rb 
in Person2 self=Tom2
in class << self self=#<Class:Tom2>
in Tom2, about to define self.hiya! for self=Tom2
Tom2.singleton_methods : ["mega_methods", "hiya!"]
Tom2.instance_methods : ["hi"]
hiYA!
hi

关于ruby - 类中的产量 << 类方法中的 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14547516/

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