gpt4 book ai didi

Ruby——确保局部变量不与方法名称冲突

转载 作者:太空宇宙 更新时间:2023-11-03 17:01:34 25 4
gpt4 key购买 nike

我正在尝试通过应用单一职责原则来精简我的胖模型。我将大量通用代码剔除到 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 方法和它周围的环境完全无关?

最佳答案

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

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

<强>1。局部变量和setter方法之间的歧义

如果你有这个:

variable_name =

那么它总是被解释为局部变量赋值。如果你想引用方法 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()

关于Ruby——确保局部变量不与方法名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14054893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com