Может кто-нибудь объяснить использование префикса переменной @ в этом фрагменте ruby? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь лучше понять использование переменных экземпляра вне стандартных объявлений классов.Это может быть странным примером, но это потому, что символ @ используется вне объявления класса, и я еще не видел этого.

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')

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Начальный контекст выполнения Ruby-программы - это объект, который является экземпляром класса Object.Если вы попытаетесь запросить объект с помощью inspect или p, он просто вернет "main", как указано здесь

Установка значений, таких как @blah, создаст переменные экземпляра для этого объекта верхнего уровня.

Следующий короткий фрагмент должен продемонстрировать это.

Проверка контекста просто возвращает main, это Object, точнее экземпляр из Object class.

Первоначальный список переменных экземпляра представляет собой пустой массив, но после того, как вы задали некоторые с помощью @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]
0 голосов
/ 18 мая 2018

В ruby ​​все является объектом .Например, в вашем коде вы на самом деле находитесь в main объекте.

Если в вашем файле помещает self.class , вы увидите, что находитесь под main object и класс Object .

В практическом смысле, использование @ или нет, не будет иметь значения.Если вы объявите класс @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...