Chcę stworzyć pętlę dla użytkownika, dopóki nie da mi numeru. Ale nie znam prawa metody, aby sprawdzić, czy jest to liczba lub ciąg. Cóż coś takiego.

puts "Enter your age."
age = gets.chomp.to_i
while age.empty?
    age = gets.chomp.to_i
end 

Puste metody powodują to w błąd.

1
E. Tahiraj 3 czerwiec 2018, 19:46

3 odpowiedzi

Najlepsza odpowiedź

Użyj poniżej kodu:

puts "Enter your age."
age = Integer(gets.chomp) rescue nil
while age.nil?
 age = Integer(gets.chomp) rescue nil
end
4
rahul mishra 3 czerwiec 2018, 17:24

Kernel # pętla ze słowem kluczowym {{ X0}} jest powszechnie używany do takich zadań.

r = /
    \A    # match beginning of string
    [1-9] # match a digit greater than zero
    \d*   # match zero or more digits
    $     # match end of line
    /x    # free-spacing regex definition mode

loop do
  print "Enter your age: "
  age = gets[r]
  break age.to_i unless age.nil?
end

Jeśli wprowadzono "34\n", linia w terminalu pojawi się w następujący sposób:

Enter your age: 34

Zobacz Kernel # Drukuj. Jeśli Kernel # stawia, byłoby wyświetlone.

Enter your age:
34

Należy zauważyć, że pierwsza kotwica (\A) pasuje do początku ciągu mając na uwadze, że druga kotwica ($) pasuje do końca linii . (Mieszanie początku i końca klin i kotwice jest niezwykłe.) Można zapisać age = gets.chomp[/\A\d+\z/], gdzie \z pasuje do końca ciągu.

2
Cary Swoveland 3 czerwiec 2018, 20:36

Jeśli potrzebujesz Filtruj również negatywne liczby całkowite , możesz sprawdzić, czy wejście zawiera tylko liczby. Na przykład:

age = nil
loop do
  puts "Enter your age: "
  age = gets.chomp
  break if (age.scan(/\D/).empty? & !age.empty?)
end
puts "Your age is #{age}"

age = nil wymagane do zainicjowania zmiennej i używania poza pętlą. Lub musisz użyć @age.

.scan(/\D/) Generuje tablicę zawierającą wszystkie pojedyncze znaki ciągu, które nie jest cyfrą {X1}}. Jeśli tak, jeśli tablica jest pusta, oznacza to, że ciąg jest wykonany z cyfr. Na przykład:

p "my age is 30".scan(/\D/) #=> ["m", "y", " ", "a", "g", "e", " ", "i", "s", " "]
p "30".scan(/\D/) #=> []
1
iGian 3 czerwiec 2018, 20:37