2017-08-17 9 views
0

名前の文字列を配列に格納するプログラムを作成しました。これはgets.chompを使用してユーザーの入力を求めることから始まり、ADD Nameをタイプした後、pushを使用して配列に名前を追加します、およびDel Nameを使用して配列からその名前を削除すると、 "Replacement Name1 Name2"と入力してName1をName2に置き換えます。 はあなたがBase classに、このメソッドを追加することができますruby​​を使用して文字列内の単語を切り替える

class Base 
    @@names_array = Array.new(0) 

    def set_names_array(name) 
    @@names_array.push(name) 
    end 

    def get_names_array 
    return @@names_array 
    end 

    def delete_name(name) 
    @@names_array.delete(name) 
    end 
end 


class Op 
    loop_flag = true 
    puts "Type ADD 'name' to add a name, DEL 'name' to delete, and EXIT to end program." 

    while loop_flag 
    command = gets.chomp 
    @nameobj = Base.new 

    if command[0..2] == "ADD" 
     @@name = command[4, command.length] 

     @nameobj.set_names_array(@@name) 

     puts "#{@@name} was added." 
     puts "Names:" 
     puts "#{@nameobj.get_names_array}" 
    end 

    if command == "EXIT" 
     puts "Ended." 
     loop_flag = false 
    end 

    if command[0..2] == "DEL" 
     for i in @nameobj.get_names_array 
     if i == command[4, command.length] 
      @nameobj.delete_name(i) 
      puts "Names:" 
      puts "#{@nameobj.get_names_array}" 
     end 
     end 
    end 

    if command[0..2] == "REP" 
    # cannot do [4, command.length] because there will be 2 names with 
    # various lengths which aren't fixed. 
    end 

    end 
end 
+4

実際には、本当に*本当に*そのようなコードを 'class'定義の中に入れてはいけません。それは目的を果たさない。クラスを使用している場合は、実際のメソッド内でユーザーとのやり取りを行う必要があります。 – tadman

+0

また、 'commands = gets.chomp.split(/ \ s + /)'を使ってユーザー入力を一連の単語に分割することも検討してください。次に、単語を 'case'し、各コマンドを真っ直ぐな' where'節で処理します。 – tadman

+0

もう1つのことは、 'break'を使ってループを壊すことができるということです。内部で' break'を使って 'loop do ... end'を実行することは、操作する必要のある任意のループ終了変数を持つよりも優れています。 'break'は即時ですが、フラグを設定することはできません。また、他の動作の発生を防ぐことはできません。 – tadman

答えて

1

事前:)にありがとう:

def replace_names_array(name_to_replace, new_name) 
    @@names_array = @@names_array.map do |name| 
    name == name_to_replace ? new_name : name 
    end 
end 
1

ここで注意すべきことがたくさんがありますが、最も重要なのは ながら、あなたが許可されているということです の練習でクラスやモジュール定義内に自由形式のコードを置くことをお勧めします。クラスやモジュールレベルでいくつかのメタプログラミングをしているような他のものがない場合を除いて、落胆します。

事実上すべての場合、 メインコンテキスト、これらの定義の外、または必要に応じてよく定義された メソッド内でコードを表現したいと思うでしょう。

深く掘り下げて、定義したBaseクラスは、クラスレベルの 変数を排他的に使用しているようです。これは、newが生成するすべてのオブジェクトが技術的に異なっていても機能的に同じであることを意味します。これは、今非常に簡単です使用

module NameRegistry 
    def self.names 
    @names ||= [ ] 
    end 
end 

、私は2番目に説明します:あなたはおそらく たいのは、単純なシングルトンバージョンです。次の は、その責任を劇的に減らすことによってパーサークラスです。

class CommandParser 
    def parse(line) 
    case (line) 
    when /\AADD\s+(.*)\z/i 
     NameRegistry.names.push($1) 
    when /\ADEL\s+(.*)\z/i 
     NameRegistry.names.delete($1) 
    when /\AREP\s+(.*)\s+WITH\s+(.*)\z/i 
     if (NameRegistry.names.delete($1)) 
     NameRegistry.names.push($2) 
     end 
    when /\AEXIT\z/i 
     # Signal that this command was terminal 
     return false 
    end 

    # Default to success 
    true 
    end 
end 

これは、このようになります。メインコードの塊につながる:

puts "Type ADD 'name' to add a name, DEL 'name' to delete, and EXIT to end program." 

parser = CommandParser.new 

while (parser.parse(gets.chomp)) 
    puts "Names: #{NameRegistry.names.join(', ')}" 
end 
あなたは、 を柔軟だし、簡単に、より珍しいユースケースに適合させることができる簡単な文法を定義するために正規表現を使用することができます
関連する問題