gpt4 book ai didi

ruby - Ruby 中同名的局部变量和方法?

转载 作者:行者123 更新时间:2023-12-04 02:20:47 33 4
gpt4 key购买 nike

def gen_times(factor) do
return Proc.new {|n| n*factor}
end

gen_times.class # ArgumentError 0 for 1
gen_times(3).class # Proc
gen_times = 2
gen_times.class # Fixnum
times3 = gen_times(3) # A normal, working Proc

第一个 gen_times.class 给出了一个 ArgumentError,所以我假设它返回 gen_times 的返回值的类名,这在下一行中得到确认。

但是,我分配了 gen_times,它变成了一个 Fixnum。但是,我仍然可以使用 gen_times 返回 Procs。

我记得 Fixnum 对象有立即值,对象本身用于赋值,而不是对它的引用。

那么,说gen_times是一个引用方法的Fixnum对象对不对呢?

最佳答案

在 ruby​​ 中你可以有同名的局部变量和方法。这有一些复杂性,例如类中的 setter 方法:

class Test
def active
@active
end

def active=(value)
@active = value
end

def make_active
active = true
end
end

t1 = Test.new
t1.active = true
t1.active #=> true

t2 = Test.new
t2.make_active
t2.active #=> nil

t1 对象的代码将返回预期的结果,但 t2 的代码返回 nil,因为 make_active 方法实际上是创建局部变量而不是调用 active= 方法。您需要编写 self.active = true 才能完成这项工作。

当您编写 gen_class 时,ruby 会尝试访问局部变量,如果未定义则 ruby​​ 会尝试调用方法。您可以通过编写 gen_class() 显式调用您的方法。

关于ruby - Ruby 中同名的局部变量和方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864500/

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