有人可以解释一下此 ruby 代码段中实例变量 @ 前缀的用法吗?



我试图更好地了解标准类声明之外的实例变量用法。这可能是一个奇怪的例子,但这是因为@符号是在类声明之外使用的,我还没有看到这一点。

require "mysql"
@db_host  = "localhost"
@db_user  = "root"
@db_pass  = "root"
@db_name = "your_db_name"
client = Mysql::Client.new(:host => @db_host, :username => @db_user, 
:password => @db_pass, :database => @db_name)
@cdr_result = client.query("SELECT * from your_db_table_name')

在 ruby 中,一切都是对象。例如,在您的代码中,您实际上位于对象中。

在你的文件中,如果你确实把self.class,你会看到你在对象下,类是对象

实际上,无论是否使用 @,都不会有任何区别。如果声明一个类@myvar您将作为实例变量在整个主对象中。您的变量将在该文件的任何方法中可见。

def set_country
@myvar = 'Brazil'
end
def get_country
puts @myvar
# @myvar is visible here
end
------------------
def set_country
myvar = 'Brazil'
end
def get_country
puts myvar
# cannot access 'Brazil' value
end

Ruby 程序的初始执行上下文是一个对象,即 Object 类的实例。 如果您尝试使用 inspect 或 p 查询对象,它将简单地返回 "main",如此处所述

设置值(如 @blah(将在此顶级对象上创建实例变量。

以下简短片段应演示这一点。

检查上下文只是返回main,它是一个Object,更具体地说是Object类的一个实例

实例变量的初始列表是一个空数组,但在使用 @blah 设置了一些变量后,您可以看到它们已添加到实例变量列表中。

在您发布的示例中,实际上不需要使用实例变量,局部变量就可以了。

p self
puts self.class
puts instance_of? Object
puts "instance variables = #{self.instance_variables}"
@db_host  = "localhost"
@db_user  = "root"
@db_pass  = "root"
@db_name = "your_db_name"
puts "instance variables = #{self.instance_variables}"
main 
Object
true
instance variables = []
instance variables = [:@db_host, :@db_user, :@db_pass, :@db_name]

最新更新