我有一个Event模型。这是一个超级简单的模型,有两个before_save回调。
其中一个是:
def set_note
if status == "ON"
core = RubySpark::Tinker.new(ENV["COREID"])
core.digital_write(0, "HIGH")
elsif status == "OFF"
core = RubySpark::Tinker.new(ENV["COREID"])
core.digital_write(0, "LOW")
end
end
我以前在方法之外有'core = RubySpark',但应用程序返回了一个错误,'core'是一个无效的局部变量。我可以将其设置为实例变量吗?可以在模型中设置实例变量吗?
答案 0 :(得分:1)
我个人对此的偏好是将一些代码提取到另一种方法中。
这样的事情:
def set_note
if status == "ON"
core_digital(0, "HIGH")
elsif status == "OFF"
core_digital(0, "LOW")
end
end
def core_digital(num, val)
core_method.digital_write(num, val)
end
def core_method
RubySpark::Tinker.new(ENV["COREID"])
end
您可能希望将该方法命名为比我的示例更有意义的方法。
答案 1 :(得分:0)
这实际上取决于调用此方法的次数,或者实际上,调用RubySpark::Tinker.new(ENV["COREID"]
的次数。如果只有一次,则不需要将其声明为实例变量。你可以这样做:
def set_note
core = RubySpark::Tinker.new(ENV["COREID"])
if status == "ON"
core.digital_write(0, "HIGH")
elsif status == "OFF"
core.digital_write(0, "LOW")
end
end
但是,如果您认为此方法在同一请求中多次执行,那么您可以使用memoization
将core
更改为实例变量并使用||=
运算符。
def set_note
@core ||= RubySpark::Tinker.new(ENV["COREID"])
if status == "ON"
@core.digital_write(0, "HIGH")
elsif status == "OFF"
@core.digital_write(0, "LOW")
end
end
答案 2 :(得分:0)
是。使用实例变量是对象保留应该可供多个方法访问的信息的设计方式。
只有该对象的实例才具有该值(如名称实例变量所暗示的那样),因此它不会对其他实例产生负面影响。
正如已经提出的那样,有些方法可以通过将部分方法抽象为另一种方法来减少重复次数。这是一个好主意,但问题的基本答案就是“是的,这就是它的用途。”