0

外部スクリプトをリンクする必要があるプログラムを作成しています。

現時点では、指定されたディレクトリに外部スクリプトが存在するかどうかを確認するバリデータ メソッドを作成しようとしています。そうでない場合、エンドユーザーは、スクリプトを含むディレクトリへの完全パスまたは相対パスを入力するよう求められます。

ただし、ディレクトリに入らずに終了するオプションをユーザーに提供したいと思います。

これが私が現在使用している方法です。コメント化された部分のコメントを外すと、inp.downcase == "quit" の場合でも引数エラーが発生します...

def signalp_validator(signalp_dir)
    if File.exist? "#{signalp_dir}/signalp"
        signalp_directory = signalp_dir
    else
        puts # a blank line
        puts "Error: The Signal P directory cannot be found in the following location: \"#{signalp_dir}/signalp\"."
        begin 
            puts # a blank line
            puts "Please enter the full path or a relative path to the Signal P directory." 
            print "> "
            inp = $stdin.gets.chomp
        raise ArgumentError, "Error: The Signal P directory cannot be found in the following location: \"#{inp}/signalp\"." unless File.exist? "#{inp}/signalp" # || inp.downcase == "quit"
        rescue Exception => e
            puts # a blank line
            puts e.message
        retry
        else
        #   if inp.downcase == "quit"
        #       abort "\nError: A output directory is required - please create one and then try again.\n\n"
        #   else
                signalp_directory = inp
            end
        end
    end
    return signalp_directory 
end

ここから RaiseArgument 行を変更すると (上記のスクリプトのように)

raise ArgumentError, "Error: The Signal P directory cannot be found in the following location: \"#{inp}/signalp\"." unless File.exist? "#{inp}/signalp" || inp.downcase == "quit" 

これに、

raise ArgumentError, "Error: The Signal P directory cannot be found in the following location: \"#{inp}/signalp\"." unless inp.downcase == "quit" || File.exist? "#{inp}/signalp"

次のエラーが表示されます

    project/np_search/lib/np_search/library.rb:17: syntax error, unexpected tSTRING_BEG, expecting keyword_end (SyntaxError)
    ...case == "quit" || File.exist? "#{inp}/signalp"
    ...                               ^

私が間違っていることと、それを修正する方法を知っている人はいますか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

@sawa さんの回答はそれをよく表していると思います。

もう 1 つのことは、制御フローに例外を使用するのをやめるということです。

この入力チェックにはloopまたはを使用できます。whileここでこれらの言語構造を見てください: http://www.tutorialspoint.com/ruby/ruby_loops.htmまたはここhttp://ruby.bastardsbook.com/chapters/loops/

于 2013-10-14T16:00:54.660 に答える