อัญประกาศคู่กับเดี่ยว


172

ฉันจริงๆใหม่เพื่อทับทิมและฉันพยายามที่จะเข้าใจว่ามีเวลาที่เฉพาะเจาะจงเมื่อฉันควรใช้VS""''

ฉันใช้เครื่องหมายคำพูดเดี่ยวบ่อยครั้งเพราะพิมพ์ง่ายกว่า แต่ฉันไม่แน่ใจว่าควร

เช่นget 'user/new'vsget "user/new"


12
คุณแน่ใจหรือว่านี่เป็นคำถาม RoR ไม่ใช่แค่คำถาม Ruby
Ignacio Vazquez-Abrams

มีคู่มือสไตล์ที่เกี่ยวข้องในการเลือกเมื่อไม่ต้องการการแก้ไขสตริงหรือไม่?
William Entriken

คำตอบ:


202

" " ช่วยให้คุณทำการแก้ไขสตริงเช่น:

world_type = 'Mars'
"Hello #{world_type}"

1
ดังนั้นโดยทั่วไปเพียงใช้เครื่องหมายคำพูดสองครั้งตลอดเวลาใช่ไหม
nekonari

8
ไม่ - อัญประกาศคู่อนุญาตสำหรับการแก้ไขสตริง หากคุณไม่ต้องการการแก้ไขสตริงคุณก็ไม่ควรใช้เครื่องหมายคำพูดคู่
Panh

4
ไม่มีเหตุผลที่จะใช้เครื่องหมายคำพูดคู่เฉพาะเมื่อคุณต้องการการแก้ไขไม่มีผลกระทบต่อประสิทธิภาพที่สำคัญและมันจะทำให้คุณคิดว่าคุณต้องใช้อะไร เพียงใช้สตริงที่มีเครื่องหมายคำพูดคู่
Matheus

137

ยกเว้นการแก้ไขความแตกต่างอีกอย่างคือ 'ลำดับหนี' ไม่ทำงานในเครื่องหมายคำพูดเดี่ยว

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
'don\'t'ยกเว้นสำหรับการหลบหนีราคาเดียวตัวเองเช่น
Sparhawk

3
นี่เป็นคำตอบที่มีประโยชน์มากสำหรับการทดสอบนี้ ฉันไม่เคยรู้เลยว่าการอ้างคำเดี่ยวนั้นมีไว้สำหรับพิมพ์ทุกอย่างระหว่างเครื่องหมายคำพูดเดี่ยวยกเว้นคำพูดที่ต้องหลีกหนี ขอบคุณ.
Jay Godse

6
และแบ็กสแลชก็ลองใช้puts '\\'มันจะพิมพ์สแลชเดียวเท่านั้น ดูที่นี่stackoverflow.com/questions/25499046/…
Hardik

yup เป็นเพียงสองกรณีเท่านั้นที่คุณสามารถหลบหนีได้ด้วยคำพูดเดียว
Alexis

@Alexis ไม่แน่ใจอาจแตกต่างกันเล็กน้อยเกี่ยวกับประสิทธิภาพ
lfx_cool

40

เพื่อตอบคำถามของคุณคุณต้องใช้""เมื่อคุณต้องการทำการแก้ไขสตริง:

a = 2
puts "#{a}"

ใช้คำพูดง่ายๆ

นอกจากนี้หากคุณสงสัยว่ามีความแตกต่างในแง่ของประสิทธิภาพหรือไม่มีคำถามยอดเยี่ยมเกี่ยวกับเรื่องนี้ใน StackOverflow

และถ้าคุณยังใหม่กับ RoR ฉันขอให้คุณเลือกหนังสือ Ruby ที่เหมาะสมเพื่อเรียนรู้พื้นฐานของภาษา มันจะช่วยให้คุณเข้าใจในสิ่งที่คุณกำลังทำ ผมเองขอแนะนำสายดินดี Rubyist


34

มีความแตกต่างระหว่าง''เครื่องหมายคำพูดเดี่ยวและคู่""ใน Ruby ในแง่ของสิ่งที่จะได้รับการประเมินเป็นสตริง

เริ่มแรกฉันต้องการชี้แจงว่าในรูปแบบตัวอักษรของสตริงอะไรก็ตามที่อยู่ระหว่างเครื่องหมายคำพูดเดี่ยวหรือคู่ได้รับการประเมินว่าเป็นวัตถุสตริงซึ่งเป็นตัวอย่างของคลาส Ruby String

ดังนั้น'stackoverflow'และ"stackoverflow"ทั้งสองจะประเมินอินสแตนซ์ของคลาส String โดยไม่มีความแตกต่างเลย

ความแตกต่าง

ความแตกต่างที่สำคัญระหว่างรูปแบบตัวอักษรทั้งสองของสตริง (อัญประกาศเดี่ยวหรือคู่) คือเครื่องหมายอัญประกาศคู่อนุญาตให้ใช้สำหรับ escape sequences ขณะที่ single quote ไม่ได้!

สตริงตัวอักษรที่สร้างขึ้นโดยคำพูดเดียวไม่สนับสนุนการinterpollation สตริงและไม่หนีลำดับ

ตัวอย่างที่เรียบร้อยคือ:

"\n" # will be interpreted as a new line

แต่ทว่า

'\n' # will display the actual escape sequence to the user

การแก้ไขด้วยเครื่องหมายคำพูดเดี่ยวไม่ทำงานเลย:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

ปฏิบัติที่ดีที่สุด

เนื่องจาก Ruby Linters ส่วนใหญ่แนะนำให้ใช้ตัวอักษรอัญประกาศเดี่ยวสำหรับสตริงของคุณและไปหา double double ในกรณีของลำดับการแก้ไข / การหลบหนี


1
ดังนั้นหากคุณมี = '\ n' และ b = "# {a}" b จะถูกตีความว่าเป็นบรรทัดใหม่หรือตามลำดับการหลบหนีหรือไม่
NathanTempelman

4
ช่วงเวลาที่คุณกำหนด a = '\ n' a จะถูกตีความว่าเป็น "\\ n" โดยการเชื่อมต่อ a ถึง b คุณจะไม่ได้รับบรรทัดใหม่ b จะประเมินเป็น "\\ n" (ไม่มีบรรทัดใหม่ที่คุณจะได้รับลำดับหนี) a = '\ n' => "\\ n" โดยที่ a = "\ n" => "\ n"
aloucas

6

สตริงที่ยกมาเดี่ยวไม่ประมวลผลรหัสหลบหนี ASCII (\ n, \ t ฯลฯ ) และพวกเขาจะไม่ทำการแก้ไขสตริงในขณะที่ทั้งสองอ้างถึงทำทั้งสองอย่าง

ตัวอย่างรหัส Escape:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

ตัวอย่างการแก้ไข:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27

4

คล้ายกับคำตอบ "\ n" ในการพิมพ์ต่อไปนี้เป็นอีกกรณีหนึ่งของความแตกต่าง

puts "\1"  -> get special character
puts '\1'  -> get \1

ดังนั้นดูเหมือนว่า * ถูกแปลงเป็นอักขระที่หลีกเลี่ยงในเครื่องหมายคำพูดคู่ แต่ไม่อยู่ในเครื่องหมายคำพูดเดี่ยว BTW มันจะส่งผลกระทบต่อการส่งออกเมื่อใช้ในการแสดงออกปกติเช่น str.gsub (/ การแสดงออกปกติ /, '\ 1, \ 2')


2

อีกเหตุผลที่คุณต้องการใช้ single-quote คือเมื่อผ่านรูปแบบ regex เป็นสตริง:

รูปแบบ regex นี้จะทำงานได้เนื่องจากส่งผ่านภายในเครื่องหมายคำพูดเดี่ยว:

"123 ABC".match('\d')
=> #<MatchData "1">

รูปแบบ regex นี้จะล้มเหลวเนื่องจากส่งผ่านภายในเครื่องหมายคำพูดคู่ (คุณจะต้องหลีกเลี่ยงเพื่อให้มันทำงานได้):

"123 ABC".match("\d")
=> nil

-8

ในกรณีเฉพาะนี้มันไม่ต่างกับวิธีที่คุณเขียน พวกเขาเทียบเท่า นอกจากนี้คุณอาจต้องการอ่านคำแนะนำ / บทแนะนำ Ruby เพิ่มเติมอีก :)


4
พวกเขาจะไม่เทียบเท่ากันเป็นคำพูดสองครั้งช่วยให้การตีความสตริง
Jason Noble

7
คุณได้อ่านส่วน "ในกรณีนี้โดยเฉพาะ" ก่อนที่จะทำการสังเกตการณ์ที่ฉลาดที่สุดหรือไม่?
Geo

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