Ruby中具有相同名称的局部变量和方法?
第一个gen_times.class给出一个ArgumentError,因此我假设它返回gen_times返回值的类名,这将在下一行中确认 然后,我分配gen_时间,它就变成了Fixnum。但是,我仍然可以使用gen_时间返回进程 我记得Fixnum对象有立即值,并且对象本身用于赋值,而不是对它的引用Ruby中具有相同名称的局部变量和方法?,ruby,object,methods,Ruby,Object,Methods,第一个gen_times.class给出一个ArgumentError,因此我假设它返回gen_times返回值的类名,这将在下一行中确认 然后,我分配gen_时间,它就变成了Fixnum。但是,我仍然可以使用gen_时间返回进程 我记得Fixnum对象有立即值,并且对象本身用于赋值,而不是对它的引用 那么,说gen_times是一个引用方法的Fixnum对象对吗?在ruby中,可以使用相同名称的局部变量和方法。这有一些复杂性,例如类中的setter方法: def gen_times(facto
那么,说gen_times是一个引用方法的Fixnum对象对吗?在ruby中,可以使用相同名称的局部变量和方法。这有一些复杂性,例如类中的setter方法:
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
t1对象的代码将返回预期的结果,但t2的代码将返回nil,因为make_active方法实际上是在创建局部变量,而不是调用active=method。您需要将self.active=true写入以使其生效
当您编写gen_类时,ruby尝试访问局部变量,如果它未定义,ruby尝试调用方法。您可以通过编写gen_class()来显式调用方法。局部变量和局部函数可以使用相同的名称。为了明确地区分它们,可以使用括号。我不得不读了几遍才能弄清楚你在问什么。我认为最好是将运行代码的结果与代码本身内联,或者作为注释,或者以“我尝试了这个:……然后发生了这个:……所以我尝试了这个:……然后发生了那个……”的格式显示出来
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