Ruby on rails 如何正确设置带有实例变量集的实例变量?

Ruby on rails 如何正确设置带有实例变量集的实例变量?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在查看文档时发现,给出的示例代码是这样做的: obj.instance_variable_set(:@instnc_var, "value for the instance variable") 然后允许您在类的任何实例方法中以@instnc_var的形式访问变量 我想知道为什么在@instnc\u var之前需要有一个冒号:。冒号是做什么的?我的第一反应是告诉你不要使用实例变量集,除非你真的知道它的用途。它本质上是一种元编程工具,或者是一种绕过实例变量可见性的技巧 也就是说,如果该变量没有

我在查看文档时发现,给出的示例代码是这样做的:

obj.instance_variable_set(:@instnc_var, "value for the instance variable")
然后允许您在类的任何实例方法中以@instnc_var的形式访问变量


我想知道为什么在
@instnc\u var
之前需要有一个冒号
。冒号是做什么的?

我的第一反应是告诉你不要使用
实例变量集,除非你真的知道它的用途。它本质上是一种元编程工具,或者是一种绕过实例变量可见性的技巧

也就是说,如果该变量没有setter,您可以使用
instance\u variable\u set
对其进行设置。如果控制代码只创建一个setter,效果会好得多

请尝试查看绝大多数实例变量设置需求。它们是一种惯用的方式,“免费”为实例变量提供getter和setter,而无需编写这些函数


如果您确实需要实例变量集,它允许第一个参数为a,它是要设置的实例变量的名称。冒号是Ruby语言的一部分,类似于“符号文字”:当您键入
:foo
时,您创建了一个带有值foo的符号,就像您直接在代码中键入
“bar”
时,您创建了一个带有值“bar”的字符串文字一样。

不是我在使用它,这是rabl库:)我只是想提交一个拉请求来修复我引用的问题,但我不想在不完全了解修复程序工作原理的情况下提交它。他们将其用于元编程,但不是更改现有变量。他们正在创建实例变量,供用户稍后使用。另外,设置_instance_变量的第一个参数可以是字符串。好的,谢谢。我“修复”的问题实际上已经修复,因为我在更新gem后没有重新启动服务器。另外,我只想指出,如果传入的字符串的第一个字符是@符号,则冒号是可选的。实例变量也可以作为字符串引用:
“@a”
(或
:@a
)。