Ruby не может получить доступ к переменной вне метода? - PullRequest
18 голосов
/ 22 февраля 2012

Я новичок в Ruby, и кажется, что Ruby поддерживает переменные, определенные вне метода, к которому обращаются только сейчас, когда я хочу что-то сделать:


template=<<MTEMP
#methodName#:function(){},
MTEMP
result="";
def generateMethods(mds)
  mds.each do |md|
    result+=template.gsub(/#methodName#/,md).to_s+"\n";
  end
  result;
end

puts generateMethods(['getName','getAge','setName','setAge'])

Когда я пыталсячтобы запустить его, я получил ошибку:

неопределенная локальная переменная или метод 'template' для main: Object (NameError)

Кажется, я не могу получить доступ к template и result переменная внутри метода generateMethods?

Почему?


Обновление:

Кажется, что понятие области действия отличается от того, чтов javascript?

var xx='xx';
function afun(){
  console.info(xx);
}

Приведенный выше код будет работать.

Ответы [ 3 ]

14 голосов
/ 22 февраля 2012

Переменные result и template внутри функции generateMethods отличаются от объявленных снаружи и являются локальными для этой функции. Вы можете объявить их как глобальные переменные с помощью $:

$template=<<MTEMP
#methodName#:function(){},
MTEMP
$result="";
def generateMethods(mds)
  mds.each do |md|
    $result+=$template.gsub(/#methodName#/,md).to_s+"\n";
  end
  $result;
end
puts generateMethods(['getName','getAge','setName','setAge'])

Но какова ваша цель с этой функцией? Я думаю, что есть более чистый способ сделать это, если вы сможете объяснить свой вопрос подробнее.

2 голосов
/ 22 февраля 2012

Вы объявляете локальные переменные, а не глобальные. Смотрите этот сайт для более (упрощенных) деталей: http://www.techotopia.com/index.php/Ruby_Variable_Scope

0 голосов
/ 22 февраля 2012

Локальные переменные являются локальными для области, в которой они определены. Вот почему они называются локальными переменными, в конце концов!

Ergo, вы не можете получить к ним доступ из другой области. Это целая точка локальных переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...