1

我正在尝试通过应用单一责任原则来瘦身。我将许多通用代码挑选到 mixin 中,然后将它们包含在多个类中。但是,我遇到了一个奇怪的问题,即局部变量与包含 mixin 的类的方法名称(或 attr_accessors)发生冲突。例如:

module MyAwesomeMixin
  def update_total
    my_total = self.pricing_items.reduce(0) {|sum, x| sum + x} # this borks if the "host class" has a method called my_total=
    total = my_total
  end
end

my_total=如果“宿主类”有一个名为“如何确保my_total变量完全在update_total方法范围内并且与它周围的环境完全无关”的方法,上面的代码片段会产生完全意想不到的后果?

4

2 回答 2

8

每当局部变量和方法解释之间存在歧义时,它总是被解释为局部变量。

但是,局部变量在方法定义之外将不可用,因此您无需担心“宿主类”中的名称崩溃。您只需要在update_total. 而且由于您在定义中使用了固定数量的局部变量,因此您应该能够知道要注意哪些局部变量。

1.局部变量和setter方法的歧义

如果你有这个:

variable_name =

那么它将始终被解释为局部变量赋值。如果你想引用 method variable_name=,那么你需要通过使用明显的接收器和/或一对括号来消除它与局部变量的歧义,如下所示:

self.variable_name = foo
variable_name=(foo)
self.variable_name=(foo)

2.局部变量和getter方法的歧义

如果你有:

variable_name

并且作用域中没有这样的局部变量,那么它将被解释为方法调用。如果作用域中有这样的局部变量,那么它将被解释为局部变量。如果您想在这种情况下调用该方法,再次,您需要使用显式接收器和/或一对括号来消除它与局部变量的歧义,如下所示:

self.variable_name
variable_name()
self.variable_name()
于 2012-12-27T13:46:33.097 回答
5

有些东西你没有给我们看。在这种情况下,唯一的“意外后果”是my_total=没有调用该方法,因为my_total创建了本地 var。

module MyAwesomeMixin
  def update_total
    my_total = 10 # !> assigned but unused variable - my_total
  end
end

class Foo
  include MyAwesomeMixin

  attr_accessor :my_total
end

f = Foo.new
f.my_total # => nil
f.update_total
f.my_total # => nil

如果您打算调用 setter,请在self.

module MyAwesomeMixin
  def update_total
    self.my_total = 10
  end
end

f = Foo.new
f.my_total # => nil
f.update_total
f.my_total # => 10
于 2012-12-27T13:04:20.287 回答