ファイルの操作
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 はその時点で別のファイルを実行しますが、実行されるのは最初の一度だけです。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つのクラスを置き、ファイル名はクラス名に対応するスネークケースにします。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: 未定義のローカル変数チャレンジ
簡単プログラムには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) }
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ