Ruby 实例变量与延迟加载方法
我想知道直接引用实例变量和调用返回相同实例变量的方法之间有什么区别 让我们看看下面的例子:Ruby 实例变量与延迟加载方法,ruby,Ruby,我想知道直接引用实例变量和调用返回相同实例变量的方法之间有什么区别 让我们看看下面的例子: def some_method return @var if @var.present? ... end 在函数方面,引用@var和调用某些方法之间没有区别。两者都将返回相同的值(假设我们在同一个实例中) 将在以下方面发挥同等作用: def yet_another_method var = some_method end 这些方法之间有什么不同?最后一个什么时候更好?当您不想精确地获取实例
def some_method
return @var if @var.present?
...
end
在函数方面,引用@var
和调用某些方法
之间没有区别。两者都将返回相同的值(假设我们在同一个实例中)
将在以下方面发挥同等作用:
def yet_another_method
var = some_method
end
这些方法之间有什么不同?最后一个什么时候更好?当您不想精确地获取实例变量时,您可以将实例变量包装到方法中,但只需要稍微多一些。例如,如果你想记忆,那么不要打电话
@foo
相反,您需要将它放在一个方法中并调用它
def foo; @foo ||= ... end
foo ...
或者,当变量取某个值时,如果希望返回与该变量不同的值,则需要在其中设置一个条件
def foo
if @foo == ... then ... else @foo end
end
foo ...
@bonus
包装在一个方法中,您可以通过实现自己的方法来更改bonus
的含义。这有助于您组织代码以便于更改,并使您能够依赖行为而不是数据
class Pay
attr_accessor :bonus
def initialize(b)
@bonus = b
end
def bonus
@bonus = 100 if @bonus > 100
end
end
您不能调用
@var
。你必须调用instance\u variable\u get:@var
。你说的“调用@var”是什么意思?举个例子。当两个人回答了这个问题时,这怎么可能不清楚呢@foo | |=。。。end作为至少接受一个参数(本例中为setter)的方法更有意义def foo arg1@foo | |=arg1 end
@DarekNędza如果它是一个setter,则不需要记忆。
class Pay
attr_accessor :bonus
def initialize(b)
@bonus = b
end
def bonus
@bonus = 100 if @bonus > 100
end
end