Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 实例变量与延迟加载方法_Ruby - Fatal编程技术网

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