gpt4 book ai didi

ruby - 为什么 ruby​​ 不允许从类中访问方法,除非以模块名称为前缀

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

module Hello
def self.log()
p "log called"
end

class Shape
def self.test
log
end
end

def self.test1
log
end

end

Hello::Shape.test # undefined local variable or method `log'
Hello.test1 # prints "log called"

我知道如果我在 log 前加上 Hello 就像 :Hello.log 一样,第一条语句会起作用

但是为什么Shape即使在同一个模块中也不能访问日志方法?

最佳答案

每当您键入没有显式接收者的方法调用时,例如

log

这是一样的

self.log

所以你基本上是在做

class Shape
def self.test
self.log
end
end

selfShapeShape 没有 log 方法。这就是你得到错误的原因。所以要做你想做的事,你需要在Shape中加入Hello的方法。但这是不可能的! def self.logHello 的单例类添加了一个方法,当涉及到单例方法时,Ruby 确实不允许您移动它们。单例方法仅适用于单个实例。

那么如何解决这个问题呢?关键是将 log 定义为常规实例方法 - 然后您可以轻松地将它移动到其他类和模块。

module Hello
# add all instance methods as class methods
extend self

def log
p "log called"
end

class Shape
# Module.nesting.last is just a clever way of referring to Hello
extend Module.nesting.last

def self.test
log
end
end

def test1
log
end
end

关于ruby - 为什么 ruby​​ 不允许从类中访问方法,除非以模块名称为前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039306/

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