18

ファイルには次のものwelcome.rbが含まれます。

welcome_message = "hi there"

しかし、IRBでは、作成したばかりの変数にアクセスできません。

require './welcome.rb'

puts welcome_message 

# => undefined local variable or method `welcome_message' for main:Object

require事前定義された変数を取り込み、IRBセッションに何かを入れたときに初期化作業を行うための最良の方法は何ですか?グローバル変数は正しい道のようには見えません。

4

4 に答える 4

17

必要なファイルで定義されたローカル変数にアクセスできないことは事実ですが、定数にアクセスでき、両方のコンテキストでアクセスできるオブジェクトに格納されているすべてのものにアクセスできます。したがって、目標に応じて、情報を共有する方法がいくつかあります。

最も一般的な解決策は、おそらくモジュールを定義し、そこに共有価値を置くことです。モジュールは定数であるため、必要なコンテキストでモジュールにアクセスできます。

# in welcome.rb
module Messages
  WELCOME = "hi there"
end

# in irb
puts Messages::WELCOME   # prints out "hi there"

値をクラス内に配置して、ほぼ同じ効果を得ることができます。または、ファイル内の定数として定義することもできます。デフォルトのコンテキストは、mainと呼ばれるクラスObjectのオブジェクトであるため、mainでメソッド、インスタンス変数、またはクラス変数を定義することもできます。これらのアプローチはすべて、「グローバル変数」を作成するための本質的に異なる方法であり、多かれ少なかれ、ほとんどの目的に最適ではない可能性があります。一方、スコープが非常に明確に定義されている小さなプロジェクトの場合は、問題ない場合があります。

# in welcome.rb
WELCOME = "hi constant"
@welcome = "hi instance var"
@@welcome = "hi class var"
def welcome
  "hi method"
end


# in irb
# These all print out what you would expect.
puts WELCOME
puts @welcome
puts @@welcome
puts welcome
于 2010-04-23T15:54:12.503 に答える
4

インクルードファイルで定義されているローカル変数にアクセスすることはできません。ivarsを使用できます:

# in welcome.rb
@welcome_message = 'hi there!'

# and then, in irb:
require 'welcome'
puts @welcome_message
#=>hi there!
于 2010-04-23T15:17:40.980 に答える
3

それは少なくともirbからの経験を可能にするはずです:

def welcome_message; "hi there" end
于 2010-04-23T15:15:33.700 に答える
2

このようなクラスを定義するのが最善の方法だと思います

class Welcome
  MESSAGE = "hi there"
end

次に、irbで次のようにコードを呼び出すことができます。

puts Welcome::MESSAGE
于 2010-04-23T15:12:14.063 に答える