2016-10-11 8 views
3

クリスタルのgets関数がユーザーの入力を待っていません。コンソールアプリケーションを起動すると、すぐ次のようなエラーが出力されます。 in_array関数に与えられた2番目のパラメータはNilですが、プログラムはユーザーの入力を要求しません。クリスタル関数がユーザー入力を待たずに

enter image description here

私のコードは次のようになります。

# Only alice and bob are greeted. 
def in_array(array : Array, contains : String) 
    array.each { |e| 
     if e == contains 
      return true; 
     end 
    } 

    return false; 
end 

allowed = ["Alice", "Bob"] 

puts "Please enter your name to gain access." 
name = gets 

isAllowed = in_array(allowed, name) 

if isAllowed 
    puts "You can enter the secret room" 
else 
    puts "You are not allowed to enter the secret room." 
end 

私のコードの新しいバージョンには次のものが含まれていますか? and read_line

# Only alice and bob are greeted. 
allowed = ["Alice", "Bob"] 

puts "Please enter your name to gain access." 

name = read_line.chomp 

if allowed.includes?(name) 
    puts "You can enter the secret room" 
else 
    puts "You are not allowed to enter the secret room." 
end 

しかし、変数nameにBobを入力すると、メソッドはfalseを返し、else文を実行します。

答えて

5

いくつかのこと:

  1. あなたが見ているエラーはコンパイルエラーです。これは、プログラムが実行されていないこと、コンパイルに失敗したことを意味します。
  2. getsは、たとえばdocsに示されているように、nilを返すことができます。たとえば、ユーザーがCtrl + Cを押すと、これを処理する必要があります。あなたは
  3. gets.not_nil!に、 if name = getsを行いますが、この場合は気にしない場合 gets.not_nil!を使用、または同等である read_lineを使用することができますいずれかの配列は、あなたが
+0

1. [OK]を実装しようとしているものない方法includes?を持っていますコンパイラがエラーを検出するとコンパイルが中止され、エラーを修正してこれが私にはっきりと分かるようにする必要があります。 2. gets関数をread_lineに変更しました。私は変数nameを入れて、入れた名前を表示しました。3.はい、in_array関数はincludeとまったく同じですか?私はそれを今変更しましたが、まだ許可されている配列にあるBobという名前を入れたときにfalseとなってelseを実行するため、正しく動作しません。私の新しいバージョンを私の新しいバージョン – DB93

+3

で更新しました 'gets'そして' read_line'は末尾の改行を含みます、あなたはそれを削除するために 'chomp'を呼び出す必要があります – asterite

関連する問題