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