nil show #"hi" #=> "hi" self.show #"hi" #=> "-6ren">
gpt4 book ai didi

ruby - 与 Ruby 中 IRB 的方法调用混淆

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

我正在研究方法定义并在 IRB 的 main 中调用它们。

def show
p "hi"
end
#=> nil

show
#"hi"
#=> "hi"

self.show
#"hi"
#=> "hi"

上面说的很好理解

现在让我们尝试一些不同的东西:

def Foo
p "hi"
end
#=> nil

Foo
#NameError: uninitialized constant Foo
#from (irb):4
#from C:/Ruby193/bin/irb:12:in `<main>'

虽然对 Foo 的调用如上所示引发了错误,但下面如何消除该错误?

self.Foo
#"hi"
#=> "hi"

最佳答案

在 Ruby 中,您可以在没有接收者和参数列表的情况下调用方法。然而,这意味着存在歧义:foo 是否意味着“在隐式接收器 self 上调用方法 foo 而不带参数,即等同于 self.foo()” 还是意味着“取消引用变量 foo”? Ruby 无法理解您的意思,因此有一些简单的规则。

对于局部变量,规则是foo总是方法调用,除非foo在解析时静态已知time 成为局部变量。那么,什么时候静态知道它是一个变量呢?当对该变量进行赋值时,该变量在使用前被解析(但不一定执行!)。

例子:

foo        # method call

if false
foo = 42 # will never be executed, but *will* be parsed
end

foo # variable dereference, since the `foo` assignment was parsed

对于常量变量,规则更简单:Foo 总是被解释为常量解引用。期间。

那么,如何调用这样一个名字的方法呢?简单:就像我说的,歧义只出现在没有参数列表和显式接收者的方法调用中。因此,如果我们添加其中一个或两个,Ruby 将知道我们正在尝试调用方法而不是取消引用变量:

foo()
self.foo
self.foo()

Foo()
self.Foo
self.Foo()

当然,在您上面给出的示例中,只有第一个可以工作。当你在顶层定义一个方法时,它作为一个private方法被添加到Object,并且private方法只能被调用< em>没有一个明确的接收者,即使那个接收者是self。所以,self.Foo 将不起作用,因为 Foo 是私有(private)的。 (除了在 IRb 中,为了方便起见,顶层方法是public。)

关于ruby - 与 Ruby 中 IRB 的方法调用混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15269606/

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