Czytać dane wejściowe z konsoli w Rubim?


115

Chcę napisać prosty program A + B w języku ruby, ale nie mam pojęcia, jak pracować z konsolą.


10
Mówię o Ruby, ale nie o ROR. Nie ma tam ani słowa o wejściu z konsoli.
Sergey

Odpowiedzi:


228

O czym mówisz gets?

puts "Enter A"
a = gets.chomp
puts "Enter B"
b = gets.chomp
c = a.to_i + b.to_i
puts c

Coś w tym stylu?

Aktualizacja

Kernel.getspróbuje odczytać parametry znalezione w programie ARGVi pyta tylko o konsolę, jeśli nie zostaną ARGVznalezione. Aby wymusić odczyt z konsoli, nawet jeśli ARGVnie jest pusty, użyjSTDIN.gets


59
Mam konflikt z tym rozwiązaniem: Kernel.getsspróbuj odczytać pliki znalezione w programie ARGVi pyta tylko o konsolę, jeśli nie zostaną ARGVznalezione. Aby wymusić odczyt z konsoli, nawet jeśli ARGVnie jest pusty, użyj STDIN.gets.
fguillen

3
a.to_ii b.to_imogłoby być lepiej
Dorian

jest getsblokowanie? Jeśli nie, czy istnieje substytut, który blokuje?
noMAD

1
@fguillen to świetna odpowiedź i nie powinno się jej ukrywać w komentarzach. Czy mógłbyś podać odpowiedź, proszę? Dzięki!
Dan Rosenstark

2
@Yar dzięki za sugestię, dodałem aktualizację do samej odpowiedzi.
fguillen

28

możesz również przekazać parametry przez wiersz poleceń. Argumenty wiersza poleceń są przechowywane w tablicy ARGV. więc ARGV [0] jest pierwszą liczbą, a ARGV [1] drugą liczbą

#!/usr/bin/ruby

first_number = ARGV[0].to_i
second_number = ARGV[1].to_i

puts first_number + second_number

i tak to nazywasz

% ./plus.rb 5 6
==> 11

10

Istnieje wiele sposobów uzyskiwania informacji od użytkowników. Osobiście lubię korzystać z metody gets. Kiedy używasz gets, pobiera ciąg , który wpisałeś, a także klawisz ENTER , który został naciśnięty, aby zakończyć wprowadzanie.

name = gets
"mukesh\n"

Możesz to zobaczyć w irb ; wpisz to, a zobaczysz \ n, który jest znakiem „nowej linii”, który tworzy klawisz ENTER: Wpisz name = getszobaczysz coś takiego, jak "mukesh\n" Możesz pozbyć się nieznośnego znaku nowej linii używając metody chomp .

Metoda chomp zwraca łańcuch, ale bez kończącego znaku nowej linii. Piękny wybawiciel życia metodą chomp.

name = gets.chomp
"mukesh"

Możesz także użyć terminala do odczytu danych wejściowych. ARGV to stała zdefiniowana w klasie Object . Jest instancją klasy Array i ma dostęp do wszystkich metod tablicowych. Ponieważ jest to tablica, nawet jeśli jest stała, jej elementy można bez problemu modyfikować i usuwać. Domyślnie Ruby przechwytuje wszystkie argumenty wiersza poleceń przekazane do programu Ruby (podzielone na spacje), gdy wywoływany jest plik binarny wiersza poleceń i przechowuje je jako łańcuchy w tablicy ARGV .

Po napisaniu w programie Ruby, ARGV przyjmie polecenie wiersza poleceń, które wygląda następująco:

test.rb hi my name is mukesh

i utwórz tablicę, która wygląda następująco:

["hi", "my", "name", "is", "mukesh"]

Ale jeśli chcę przekazać ograniczone dane wejściowe, możemy użyć czegoś takiego.

test.rb 12 23

i użyj tych danych wejściowych w swoim programie:

a = ARGV[0]
b = ARGV[1]

5

jeśli chcesz zachować argumenty z terminala, wypróbuj następujący kod:

A = ARGV[0].to_i
B = ARGV[1].to_i

puts "#{A} + #{B} = #{A + B}"

0

Jeśli chcesz stworzyć konsolę interaktywną:

#!/usr/bin/env ruby

require "readline"
addends = []
while addend_string = Readline.readline("> ", true)
  addends << addend_string.to_i
  puts "#{addends.join(' + ')} = #{addends.sum}"
end

Użycie (zakładając, że umieścisz powyższy fragment w summatorpliku w bieżącym katalogu):

chmod +x summator
./summator
> 1
1 = 1
> 2
1 + 2 = 3

Użyj, Ctrl + Daby wyjść

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.