gpt4 book ai didi

ruby - 为什么类方法不能与非类方法同名?

转载 作者:行者123 更新时间:2023-12-04 09:42:31 25 4
gpt4 key购买 nike

我正在学习 ruby​​,并注意到我无法创建一个名为 puts 的类方法。 :

class Printer
def initialize(text="")
@text = text
end
def puts
puts @text
end
end

错误是:
`puts': wrong number of arguments (given 1, expected 0)

我的期望是我可以使用这样的代码:
p = Printer.new("hello")
p.puts

不仅仅是因为 puts是一个内置的方法,虽然。例如,这段代码也给出了一个语法错误:
def my_puts(text)
puts text
end

class Printer
def initialize(text="")
@text = text
end
def my_puts
my_puts @name
end
end

最佳答案

tldr ;在实例范围内,puts解析为 self.puts (然后解析为本地定义的方法,而不是 Kernel#puts )。这种方法覆盖是一种阴影形式。

Ruby 有一个 'implicit self'这是这种行为的基础,是 also how the bare puts is resolved - 它来自内核,它混合到每个对象中。

The Kernel module is included by class Object, so its methods [like Kernel#puts] are available in every Ruby object. These methods are called without a receiver and thus can be called in functional form [such as puts, except when they are overridden].



在这里调用原来的同名方法, super可以使用关键字。但是,这在 X#another_method 使用参数调用 X#puts 时它期望调用 Kernel#puts 的情况下不起作用。要解决这种情况,请参阅 Calling method in parent class from subclass methods in Ruby (在适当的类型上使用别名或 instance_method)。
class X
def puts
super "hello!"
end
end

X.new.puts

附言第二个例子应该很容易失败,如 my_puts显然不接受任何参数,不会混淆另一个“看跌期权”。此外,这不是语法错误,因为它发生在任何语言解析后的运行时。

关于ruby - 为什么类方法不能与非类方法同名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62268787/

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