เหตุใดการแก้ไขสตริงจึงทำงานใน Ruby เมื่อไม่มีวงเล็บปีกกา


91

วิธีที่เหมาะสมในการใช้การแก้ไขสตริงใน Ruby มีดังนี้:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

นั่นคือวิธีที่ฉันตั้งใจจะใช้มันเสมอ

อย่างไรก็ตามฉันสังเกตเห็นบางอย่างแปลก ๆในการแก้ไขสตริงของทับทิม ฉันสังเกตเห็นว่าการแก้ไขสตริงทำงานใน Ruby โดยไม่มีวงเล็บปีกกาเกี่ยวกับตัวแปรอินสแตนซ์ ตัวอย่างเช่น:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

และการลองสิ่งเดียวกับตัวแปรที่ไม่ใช่อินสแตนซ์ไม่ได้ผล

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

ฉันได้ลองแล้วประสบความสำเร็จทั้งใน 1.9.2 และ 1.8.7

ทำไมถึงได้ผล? ล่ามมาทำอะไรที่นี่?

คำตอบ:


104

ตามภาษาโปรแกรม Rubyโดย Flanagan และ Matsumoto:

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

ดังนั้นสิ่งต่อไปนี้ควรใช้งานได้ทั้งหมด:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"

4
คำถามเด็ดจขกท. เป็นการดีที่ได้กลับไปพบกับมุมเล็ก ๆ น้อย ๆ ของภาษาที่ฉันลืมไปแล้ว
tsherif

2
แม้ว่าคำตอบของคุณจะไม่มีเหตุผลว่าทำไมหรือเกิดอะไรขึ้น แต่ฉันพบว่าเหตุผลนั้นยากที่จะตอกกลับ แม้แต่กระดานข้อความเก่า ๆ ที่ Matz แสดงความคิดเห็นบ่อยๆก็ไม่ได้ช่วยอะไร อย่างไรก็ตามคำตอบของคุณแสดงให้เห็นว่าเป็นคุณสมบัติที่ตรงข้ามกับความบังเอิญ
Charles Caldwell

1
ฉันไม่แน่ใจว่าคุณคาดหวังอะไรเป็นเหตุผล คุณหมายถึงการตัดสินใจในการออกแบบหรือไม่? ฉันเดาว่ามันเป็นความพยายามในไวยากรณ์แบบPerlเนื่องจากฉันเชื่อว่าเดิมที Ruby ถูกคิดว่าเป็น Perl ++ ก่อนที่จะมาเป็นของตัวเอง
tsherif

2
ฉันเป็น noob ที่สมบูรณ์และเพิ่งมี IDE บ่นว่าฉันทำสิ่งนี้ แต่ฉันมีงานหนักที่ทำให้มั่นใจว่าตัวเองเป็นสไตล์ที่ดี มันไม่สอดคล้องกันอย่างไม่มีจุดหมายและมีข้อเสียเช่นถ้าฉันมีตัวแปรอินสแตนซ์ @distance ที่มีค่า 100 และต้องการสร้างสตริงที่ระบุว่า "100m" โดยใช้นิพจน์เช่น "# @ distancem" ฉันจะได้สตริงว่าง เนื่องจากไม่มีตัวแปรอินสแตนซ์ 'distancem' ฟังดูเหมือนไม่ดีเลย
hormemory

3
@terriblememory โอ้มันเป็นสไตล์ที่ไม่ดีแน่นอน นั่นเป็นเหตุผลที่ฉันเริ่มตั้งคำถามโดยชี้ให้เห็นวิธีการทำที่ถูกต้อง อย่างไรก็ตามฉันเพิ่งพบว่ามันแปลกที่มันเป็นคุณสมบัติของภาษาเลยและสงสัยว่าทำไมมันถึงใช้งานได้ จากนั้นอีกครั้งก็เป็นลักษณะที่ไม่ดีเช่นกันที่จะเริ่มประโยคด้วยการเชื่อม แต่คุณจะยังคงเห็นผู้คนใช้ที่นี่และที่นั่น =)
Charles Caldwell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.