2012-02-22 12 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)

私がtemplateresult変数インナーgenerateMethodsメソッドにアクセスすることができないようですか?

なぜですか?


更新:

スコープの概念がJavaScriptであるものとは異なっているようですか?

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

上記のコードは動作します。

+1

この質問に対する適切な回答があります。[こちら](http://stackoverflow.com/a/10782889) – starfry

答えて

14

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 Rubyではグローバル変数を使用することはお勧めできません。名前の競合を回避するためにjavascriptで推奨されていないことを知っているように、グローバル変数を扱うよりも良い方法を見つける – bjhaid

-3

ローカル変数は、それらがで定義されている範囲に対してローカルである彼らはすべての後に、ローカル変数と呼ばれている理由です。!

Ergo、あなたは別の範囲からそれらにアクセスすることはできません。それはローカル変数全体のです。

+30

Javascript(とPython)では、 OPの混乱の源。あなたの答えは、あなたがRubyのやり方が自明であるように行動しなかった場合、より役に立ちます。 – Antimony

関連する問題