2012-02-22 3 views
16

Я новичок в 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']) 

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

undefined local variable or method 'template' for main:Object (NameError)

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

Почему?


Update:

кажется, что понятие сфера является отличается от того, что в JavaScript?

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

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

+1

Существует соответствующий ответ на этот вопрос [здесь] (http://stackoverflow.com/a/10782889). – starfry

ответ

14

Переменные и 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']) 

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

+0

На самом деле, я просто хочу сгенерировать некоторые методы в javascript в соответствии с именем функции. – hguser

+0

@hguser в рубине не рекомендуется использовать глобальные переменные, например, вы знаете, что он не рекомендуется в javascript, чтобы избежать конфликтов имен, найти лучший способ обработки переменных, чем объявить их глобальными. – bjhaid

-3

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

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

+30

Он работает по-разному в Javascript (и Python), предположительно источник путаницы ОП. Ваш ответ был бы более полезным, если бы вы не поступали так, как это делал Руби. – Antimony

Смежные вопросы