Menu
CoddyTech

ファイルの操作

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 1/57。

実際のプログラムはいくつかのファイルに分割されています。Rubyファイルはrequire_relativeを使って別のファイルを読み込みます。その後に、通常は.rbの拡張子を付けずに、現在のファイルからの相対パスを指定します。この行の後は、読み込んだファイルのメソッドやクラスを使用できます。

# greeting.rb
def greeting(name)
  "Hello, #{name}!"
end

# main.rb
require_relative 'greeting'
puts greeting("Ada")

ruby main.rbを実行すると、Hello, Ada!が出力されます。main.rbがgreeting.rbを読み込み、そのメソッドを呼び出します。

プログラムは、実行するファイル(ここではmain.rb)から始まり、Rubyはファイルを先頭から末尾まで実行します。require_relativeはその位置で別のファイルを読み込み、読み込むのは最初の1回だけです。2回目のrequire_relative 'greeting'はfalseを返し、何もしません。名前は、それを定義するファイルが読み込まれた後にのみ使用できます。

# main.rb
# puts greeting("Bo")          # NoMethodError: greeting.rb はまだ読み込まれていない
require_relative 'greeting'     # greeting.rb を実行し、true を返す
require_relative 'greeting'     # すでに読み込まれているため、false を返す
puts greeting("Bo")

一般的な構成では、1つのファイルに1つのクラスを置き、ファイル名にはクラス名をsnake_caseで使用します。class Dogはdog.rbに、class BankAccountはbank_account.rbに記述します。このセクションの課題では、main.rbに用意された入出力コードを置き、読み込み順にファイルごとに1行のrequire_relativeから始めます。別のクラスを基にするクラスは、先に読み込みます。

dog.rb            # class Dog ... end
bank_account.rb   # class BankAccount ... end
functions.rb      # 補助メソッド
main.rb           # require_relative の行、その後に入出力のコード

ファイル間で共有できる内容は、名前の種類によって異なります。ファイルの先頭で def を使って定義されたメソッド、クラス、定数は、そのファイルの読み込み後に読み込まれるすべてのファイルから使用できます。ローカル変数は、そのファイル内でのみ有効です:

# settings.rb
limit = 3                  # ローカル変数: settings.rb からのみ参照できる
MAX_ITEMS = 3              # 定数: 読み込み後に参照できる
def limit_text
  "at most #{MAX_ITEMS}"
end

# main.rb
require_relative 'settings'
puts limit_text            # 最大 3
puts MAX_ITEMS             # 3
# puts limit               # NameError: undefined local variable
challenge icon

チャレンジ

簡単

このプログラムには2つのファイルがあります。main.rb は greeting.rb を読み込み、名前を読み取って greeting(name) の結果を出力します。greeting.rb の greeting を完成させ、名前が Ada の場合は Hello, Ada! を、名前が空の場合は Hello, friend! を返すようにしてください。

コードは greeting.rb に書きます。main.rb には用意された入出力コードがあり、編集できません。

自分で試してみよう

require_relative 'greeting'

# 用意された入出力コード: そのままにしてください
input = []
while (line = gets)
  input << line.chomp
end
input.each { |name| puts greeting(name) }
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ