为什么我们在某些情况下使用_前缀来定义ruby中的实例变量



我在ruby类中看到一些人使用_前缀来定义像@_property这样的实例变量,而在正常情况下,attr_writer使用像@property这样的正常名称来定义实例变量。

这样做有什么意义,有什么区别?

_前缀不是一种语言特性,它没有做任何特殊的事情,它只是一种约定。

在大多数情况下,开发人员希望指示变量未使用,例如,块中未使用的块变量。或者他们想表明该变量是模块或gem的内部变量,其他人不应该直接读取或修改该变量。

根据变量的类型,这里有两个可能的答案。

实例变量

当使用_作为实例变量的前缀时(如您的问题中所述(,通常只是一种约定,以明确该实例变量是私有实现细节,不应在当前范围之外使用。您可能会遇到它,尤其是在要包含在其他一些类中的模块中——在这种情况下,实例变量由该模块定义和使用,但它属于对象本身,并且作用域为对象本身。我个人更喜欢对象范围的注册表,但是";私人的";实例变量是一种快速、肮脏且流行的方法。同样,在实例变量名称前面加上_可以减少名称冲突的机会。

# Library code
module SomeExternalLibraryModule
def foo
@_something ||= SomeExternalLibraryModule::Something.new(self)
end
end
# Application code
class User
include SomeExternalLibraryModule
attr_reader :something # name conflict "avoided"! Phew!
def bar
@_something.do_sth 
# "_" means - you'd better know what you're doing here!
# There is no guarantee that instance variable will be present in the future release
end
end

局部变量

当局部变量以_为前缀时,这意味着该变量未在代码中使用。当使用迭代器或使用您只感兴趣的其他多元素输入时,它尤其有用。

仅将_视为变量名是很常见的。它对解析器有一点特殊的意义,就是你明确地说";我不在乎那是什么;。因此,它是唯一允许在单个定义中多次使用的参数名称:

def foo(_, _, a)
a
end
foo(1,2,3) #=> 3
def bar(a,a,b); end #=> SyntaxError

然而,这通常是使用";我不在乎";有一个名字,如果你真的决定需要使用其他参数,这将使你未来的生活更轻松:

def foo(_name, _html_options, options)
options.delete(:some_option)
super
end

最新更新