0

メソッドのテキストを txt ファイルに保存する方法について皆さんから大きな反響を得ましたが、現在別の問題が発生しています。問題は、プログラムがランダムなタイトルを生成してコマンド プロンプトに出力することですが、ファイルには完全にランダムなタイトルが保存されます。たとえば、プログラムを実行すると、タイトル「Big Thing」が生成されますが、txt ファイルには「Small Game」が保存されます。CPで印刷するのと同じタイトルをプログラムに保存させる方法はありますか? コードは次のようになります。

class Generator
  def title_adj
    title_adj = [
       "Big",
       "Small"]
    item_title_adj = title_adj[rand(title_adj.length)]
  end
  def title_noun
    title_noun = [
       "Thing",
       "Game"]  
    item_title_noun = title_noun[rand(title_noun.length)]
  end
  def title
    title_adj + title_noun
  end
  def initialize(io)
    @io = io
  end
  def all
    @io.puts "Your story is called: " + title
  end
end

fict_gen = Fiction_Generator.new(STDOUT)
def prompt
  print "> "
end
puts "Do you want to generate a new title or read the existing one?"
puts "1 = Generate, 2 = Read existing"

prompt; r = gets.chomp
if r == "1"
  fict_gen.all

  File.open("Story.txt", "a+") do |file|
    fict_gen = Fiction_Generator.new(file)
    fict_gen.all
  end

elsif r == "2"
  File.open("Story.txt").each_line{ |s|
  puts s
  }
end
4

1 に答える 1

0

問題は、メソッドを呼び出すたびにランダムにタイトルを生成していることです。これを自分で証明してください:

a = Generator.new(STDOUT)
a.title #=> "BigThing"
a.title #=> "SmallThing"
a.title #=> "BigThing"

解決策として、タイトルをインスタンス変数に保存します。

def title
  @title ||= %w|Big Small|.sample + %w|Thing Game|.sample
end

||=演算子は、受信者がnilまたはの場合にのみ割り当てを実行しfalseます。

于 2013-03-22T18:15:50.910 に答える