0
blah = 10
def what?
  "#{blah}"
end
puts what?
# =>
# NameError: undefined local variable or method `blah' for main:Object
#     from (irb):3:in `what?'
#     from (irb):5
#     from E:/RailsInstaller/Ruby1.9.3/bin/irb:12:in `<main>`

なんで?これはどう書くのが正しいのでしょうか?ローカルスコープ内で変数を複製するだけですか、それともより良いバリアントがありますか?

4

3 に答える 3

4

ここで定義されたインスタンス変数またはメソッドが必要です。

@blah = 10
def what?
  "#{@blah}"
end

またはこのように:

def blah
  10
end

def what?
  "#{blah}"
end
于 2012-11-22T19:02:39.027 に答える
2

Ruby がdefキーワードを検出すると、スコープが変更されます。変数にはメソッド外のblahローカル スコープがあるため、その値を使用する場合は、それを渡す必要があります。

blah変数をインスタンス変数に変更できます。これは、記述されているメソッドのスコープ内にあります。

変数のスコープを変更するよりも、ローカル変数を渡す方がよいでしょう。

メソッド名には、一般に「ブール値」を示す疑問符が付いています。厳密には指定されていませんが、それはtrueorの戻り値になりますが、それが戻る場合やfalseの戻り値の場合に使用されることがわかります。nil

コードは次のように書くのが最適かもしれません:

def what(blah)
  blah
end

それが役立つことを願っています。

編集: 親変数に対処するには、親関係を導入する必要があります。

# encoding: utf-8

class ParentBlah
  def initialize
    @blah = "Blah"
  end
end

class ChildBlah < ParentBlah
  def use_parent_variable_sorta
   "@blah = #{@blah}"
  end
end

childblah = ChildBlah.new
puts childblah.use_parent_variable_sorta

これで、ローカル変数を使用できない理由について説明できますが、これは厳密にはスコープの問題です。ここで行ったことを行うには、同じスコープで変数を作成する必要がありました。

なぜこれが行われるのですか?オブジェクトの外部のロジックは、オブジェクトによって本質的に認識される必要がないためです。知る必要がある場合は、引数を介して値のみを導入するか、スコープを変更する必要があります。この目的のためにスコープを変更する必要がある場合、何か他のことが起こっている可能性があると考える傾向があります。

于 2012-11-22T19:06:09.997 に答える
2

blah はローカル変数です。以下で説明するように、インスタンス変数を作成するか、グローバル変数を作成するには、変数の前に「$」記号を使用します

まず、次のように変数のスコープを確認できます

blah = 10
defined? blah

結果 => 「ローカル変数」

blah をグローバル変数として作成するには、次のことができます

$blah = 10
defined? $blah

結果 => 「グローバル変数」

def what?
  puts "#{$blah}"
end

そして、メソッドを呼び出します

puts what?

結果は10になります

于 2012-11-23T04:01:05.840 に答える