เช่นในบรรทัดของรหัสนี้ฉันเขียนprint
และputs
ให้ผลลัพธ์ที่แตกต่าง
1.upto(1000).each { |i| print i if i % 2 == 0 }
เช่นในบรรทัดของรหัสนี้ฉันเขียนprint
และputs
ให้ผลลัพธ์ที่แตกต่าง
1.upto(1000).each { |i| print i if i % 2 == 0 }
คำตอบ:
puts
เพิ่มบรรทัดใหม่ในตอนท้ายของแต่ละอาร์กิวเมนต์หากยังไม่มีอีกหนึ่งบรรทัด
print
ไม่เพิ่มบรรทัดใหม่
ตัวอย่างเช่น:
puts [[1,2,3], [4,5,nil]]
จะกลับมา:
1 2 3 4 5
ในขณะที่print [[1,2,3], [4,5,nil]]
จะกลับมา:
[[1,2,3], [4,5, ไม่มี]
ขอให้สังเกตว่าการใส่ไม่ส่งออกค่าศูนย์ในขณะที่พิมพ์ไม่
ความแตกต่างใหญ่คือถ้าคุณกำลังแสดงอาร์เรย์ โดยเฉพาะกับ NIL ตัวอย่างเช่น:
print [nil, 1, 2]
จะช่วยให้
[nil, 1, 2]
แต่
puts [nil, 1, 2]
จะช่วยให้
1
2
หมายเหตุไม่มีรายการใดปรากฏ (เพียงบรรทัดว่าง) และแต่ละรายการในบรรทัดที่แตกต่างกัน
nil
print
เอาท์พุทแต่ละโต้แย้งตามด้วย$,
ที่จะตามมาด้วย$stdout
$\
มันเทียบเท่ากับargs.join($,) + $\
puts
ชุดทั้งสอง$,
และ$\
เพื่อ "\ n" print
และจากนั้นจะเป็นสิ่งเดียวกับ แตกต่างที่สำคัญการที่แต่ละอาร์กิวเมนต์puts
เป็นสายใหม่ที่มี
คุณสามารถrequire 'english'
ที่จะเข้าถึงตัวแปรทั่วโลกผู้ที่มีชื่อที่ใช้งานง่าย
english
lib
เอกสาร APIให้คำแนะนำที่ดี:
print() → nil
print(obj, ...) → nil
เขียนวัตถุที่กำหนด (s) เพื่อiOS
nil
ผลตอบแทนต้องเปิดสตรีมเพื่อการเขียน แต่ละวัตถุที่กำหนดซึ่งไม่ใช่สตริงจะถูกแปลงโดยการเรียก
to_s
ใช้เมธอด$_
เมื่อเรียกโดยไม่มีข้อโต้แย้งพิมพ์เนื้อหาของหาก
$,
ไม่ได้แยกเอาท์พุทฟิลด์ ( )nil
มันจะถูกแทรกระหว่างวัตถุ หาก$\
ไม่ได้แยกเอาท์พุทบันทึก ( )nil
มันจะผนวกเข้ากับเอาท์พุท...
puts(obj, ...) → nil
เขียนวัตถุที่กำหนด (s) เพื่อiOS เขียนขึ้นบรรทัดใหม่หลังจากที่ไม่ได้ลงท้ายด้วยลำดับการขึ้นบรรทัดใหม่
nil
ผลตอบแทนต้องเปิดสตรีมเพื่อการเขียน หากถูกเรียกพร้อมกับอาเรย์อาร์กิวเมนต์ให้เขียนแต่ละองค์ประกอบในบรรทัดใหม่ แต่ละวัตถุที่กำหนดที่ไม่ใช่สตริงหรืออาร์เรย์จะถูกแปลงโดยการเรียก
to_s
ใช้เมธอด หากถูกเรียกโดยไม่มีอาร์กิวเมนต์เอาต์พุตจะขึ้นบรรทัดใหม่เดียว
ทดลองเล็กน้อยกับคะแนนที่ระบุข้างต้นความแตกต่างที่ดูเหมือนจะเป็น:
เรียกว่ามีหลายอาร์กิวเมนต์print
แยกพวกเขาโดย 'แยกเขตเอาท์พุท' $,
(ซึ่งเริ่มต้นที่ไม่มีอะไร) ในขณะที่puts
แยกพวกเขาโดยการขึ้นบรรทัดใหม่ puts
ใส่บรรทัดใหม่หลังจากอาร์กิวเมนต์สุดท้ายในขณะที่print
ไม่
2.1.3 :001 > print 'hello', 'world'
helloworld => nil
2.1.3 :002 > puts 'hello', 'world'
hello
world
=> nil
2.1.3 :003 > $, = 'fanodd'
=> "fanodd"
2.1.3 :004 > print 'hello', 'world'
hellofanoddworld => nil
2.1.3 :005 > puts 'hello', 'world'
hello
world
=> nil
puts
ปลดอาร์เรย์โดยอัตโนมัติในขณะที่print
ไม่:
2.1.3: 001> พิมพ์ [1, [2, 3]], [4] [1, [2, 3]] [4] => ไม่มี 2.1.3: 002> ทำให้ [1, [2, 3]], [4] 1 2 3 4 => ไม่มี
print
โดยไม่มีการขัดแย้งพิมพ์$_
(สิ่งสุดท้ายที่อ่านโดยgets
) ในขณะที่puts
พิมพ์ขึ้นบรรทัดใหม่:
2.1.3 :001 > gets
hello world
=> "hello world\n"
2.1.3 :002 > puts
=> nil
2.1.3 :003 > print
hello world
=> nil
print
เขียนตัวคั่นเร็กคอร์ดเอาต์พุต$\
หลังจากสิ่งที่พิมพ์ขณะที่puts
ละเว้นตัวแปรนี้:
mark@lunchbox:~$ irb
2.1.3 :001 > $\ = 'MOOOOOOO!'
=> "MOOOOOOO!"
2.1.3 :002 > puts "Oink! Baa! Cluck! "
Oink! Baa! Cluck!
=> nil
2.1.3 :003 > print "Oink! Baa! Cluck! "
Oink! Baa! Cluck! MOOOOOOO! => nil
puts
โทรหาto_s
อาร์กิวเมนต์แต่ละตัวและเพิ่มบรรทัดใหม่ให้กับแต่ละสตริงหากไม่ได้ลงท้ายด้วยบรรทัดใหม่
เพียงแค่การส่งออกในแต่ละข้อโต้แย้งโดยการเรียกของพวกเขาprint
to_s
ตัวอย่างเช่น
puts "one two"
::
one two
{บรรทัดใหม่}
puts "one two\n"
:
one two
{new line} #puts จะไม่เพิ่มบรรทัดใหม่ในผลลัพธ์เนื่องจากสตริงจะลงท้ายด้วยบรรทัดใหม่
print "one two"
:
one two
print "one two\n"
:
one two
{บรรทัดใหม่}
และมีวิธีการส่งออกอื่น: p
สำหรับแต่ละอ็อบเจ็กต์เขียน obj.inspect โดยตรงแล้วตามด้วย newline ไปยังเอาต์พุตมาตรฐานของโปรแกรม
มันจะมีประโยชน์ในการส่งข้อความการดีบัก
p "aa\n\t"
:aa\n\t
หากคุณต้องการที่จะส่งออกอาร์เรย์ภายในสตริงโดยใช้puts
คุณจะได้รับผลลัพธ์เช่นเดียวกับถ้าคุณกำลังใช้print
:
puts "#{[0, 1, nil]}":
[0, 1, nil]
แต่ถ้าไม่ได้อยู่ภายในสตริงที่ยกมาแล้วใช่ puts
ความแตกต่างเพียงอย่างเดียวคือระหว่างบรรทัดใหม่เมื่อเราใช้
printf
แทนputs
รหัสตัวอย่างของคุณจะให้ผลลัพธ์เหมือนกัน แต่จริงๆแล้วมันไม่ได้ puts
ตัวแปรเพิ่มขึ้นบรรทัดใหม่ในตอนท้ายในขณะที่printf
หนึ่งไม่ได้เช่นเดียวกับกรณีที่มีอาร์เรย์ไม่มีการสอดแทรกเข้าไปในสตริง (จำเป็นเช่นนั้นเนื่องจากการแก้ไขเกิดขึ้นเมื่อประเมินสตริงตามตัวอักษร)