อ่านอินพุตจากคอนโซลใน Ruby?


115

ฉันต้องการเขียนโปรแกรม A + B ง่ายๆใน Ruby แต่ฉันไม่รู้ว่าจะทำงานกับคอนโซลอย่างไร


10
ฉันกำลังพูดถึง Ruby แต่ไม่ใช่ ROR ไม่มีคำใดเกี่ยวกับอินพุตจากคอนโซล
Sergey

คำตอบ:


228

คุณกำลังพูดถึงgets?

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

อะไรแบบนั้น?

ปรับปรุง

Kernel.getsพยายามอ่านพารามิเตอร์ที่พบในARGVและขอให้คอนโซลหากไม่ARGVพบ เพื่อบังคับให้อ่านจากคอนโซลแม้ว่าARGVจะไม่ได้ใช้งานเปล่าก็ตามSTDIN.gets


59
ฉันมีข้อขัดแย้งกับวิธีแก้ปัญหานี้: Kernel.getsพยายามอ่านไฟล์ที่พบARGVและขอให้คอนโซลหากไม่ARGVพบเท่านั้น เพื่อบังคับให้อ่านจากคอนโซลแม้ว่าARGVจะไม่ได้ใช้งานเปล่าSTDIN.getsก็ตาม
fguillen

3
a.to_iและb.to_iน่าจะดีกว่านี้
Dorian

กำลังgetsปิดกั้น? ถ้าไม่มีมีอะไรทดแทนที่ปิดกั้นหรือไม่?
noMAD

1
@fguillen นั่นเป็นคำตอบที่ดีและไม่ควรซ่อนอยู่ในความคิดเห็น ขอคำตอบหน่อยได้ไหม ขอบคุณ!
Dan Rosenstark

2
@Yar ขอบคุณสำหรับคำแนะนำฉันได้เพิ่มการอัปเดตให้กับคำตอบเอง
fguillen

28

คุณยังสามารถส่งผ่านพารามิเตอร์ผ่านบรรทัดคำสั่ง อาร์กิวเมนต์บรรทัดคำสั่งคือที่เก็บในอาร์เรย์ ARGV ดังนั้น ARGV [0] คือหมายเลขแรกและ ARGV [1] หมายเลขที่สอง

#!/usr/bin/ruby

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

puts first_number + second_number

และคุณเรียกแบบนี้

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

10

มีหลายวิธีในการรับข้อมูลจากผู้ใช้ ส่วนตัวชอบใช้วิธี gets เมื่อคุณใช้ gets จะได้รับสตริง ที่คุณพิมพ์และรวมถึงคีย์ENTERที่คุณกดเพื่อสิ้นสุดการป้อนข้อมูลของคุณ

name = gets
"mukesh\n"

คุณสามารถดูสิ่งนี้ได้ในirb ; พิมพ์สิ่งนี้และคุณจะเห็น \ n ซึ่งเป็นอักขระ "newline" ที่ปุ่ม ENTER สร้างขึ้น: พิมพ์name = getsคุณจะเห็นบางครั้งเช่น"mukesh\n" คุณสามารถกำจัดอักขระขึ้นบรรทัดใหม่ที่น่ารำคาญโดยใช้วิธีchomp

วิธี chomp ช่วยให้คุณกลับสตริง แต่ไม่มีการยุติการขึ้นบรรทัดใหม่ ผู้ช่วยชีวิตวิธีการ chomp ที่สวยงาม

name = gets.chomp
"mukesh"

คุณยังสามารถใช้เทอร์มินัลเพื่ออ่านอินพุต ARGVเป็นค่าคงที่ที่กำหนดไว้ในวัตถุ ชั้น เป็นอินสแตนซ์ของคลาส Arrayและสามารถเข้าถึงเมธอดอาร์เรย์ทั้งหมด เนื่องจากเป็นอาร์เรย์แม้ว่าจะเป็นค่าคงที่ แต่องค์ประกอบต่างๆจึงสามารถแก้ไขและล้างข้อมูลได้โดยไม่มีปัญหา โดยค่าเริ่มต้นทับทิมจับทุกอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งไปยังโปรแกรมทับทิม (แยกด้วยช่องว่าง) เมื่อไบนารีบรรทัดคำสั่งเรียกและเก็บไว้เป็นสตริงในอาร์เรย์ ARGV

เมื่อเขียนภายในโปรแกรม Ruby ของคุณARGVจะใช้คำสั่งบรรทัดคำสั่งที่มีลักษณะดังนี้:

test.rb hi my name is mukesh

และสร้างอาร์เรย์ที่มีลักษณะดังนี้:

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

แต่ถ้าฉันต้องการส่งผ่านอินพุตที่ จำกัด เราสามารถใช้สิ่งนี้ได้

test.rb 12 23

และใช้อินพุตเหล่านี้ในโปรแกรมของคุณ:

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

5

หากคุณต้องการเก็บอาร์กิวเมนต์จาก Terminal ให้ลองใช้รหัสต่อไปนี้:

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

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

0

หากคุณต้องการสร้างคอนโซลแบบโต้ตอบ:

#!/usr/bin/env ruby

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

การใช้งาน (สมมติว่าคุณใส่ข้อมูลโค้ดด้านบนลงในsummatorไฟล์ในไดเร็กทอรีปัจจุบัน):

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

ใช้Ctrl + Dเพื่อออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.