สัญลักษณ์ในทับทิมคืออะไร


45

ฉันยังใหม่กับโลกทับทิมและฉันก็สับสนกับแนวคิดของ Symbols สัญลักษณ์และตัวแปรต่างกันอย่างไร ทำไมไม่ใช้แค่ตัวแปร?

ขอบคุณ


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

คำตอบ:


70

ตัวแปรและสัญลักษณ์ต่าง ๆ ตัวแปรชี้ไปยังข้อมูลประเภทต่างๆ ใน Ruby สัญลักษณ์เป็นเหมือนสตริงมากกว่าหนึ่งตัวแปร

ใน Ruby สตริงสามารถเปลี่ยนแปลงได้ในขณะที่สัญลักษณ์ไม่เปลี่ยนรูป นั่นหมายความว่าจะต้องสร้างสัญลักษณ์เพียงชุดเดียว ดังนั้นถ้าคุณมี

x = :my_str
y = :my_str

:my_strจะถูกสร้างขึ้นเพียงครั้งเดียวและxและyชี้ไปที่พื้นที่เดียวกันของหน่วยความจำ ในทางกลับกันถ้าคุณมี

x = "my_str"
y = "my_str"

สตริงที่มีmy_strจะถูกสร้างขึ้นเป็นครั้งที่สองและxและyจะชี้ไปที่อินสแตนซ์ที่แตกต่างกัน

เป็นผลให้สัญลักษณ์มักจะถูกใช้เป็นสิ่งที่เทียบเท่ากับ enums ใน Ruby เช่นเดียวกับปุ่มในพจนานุกรม (แฮช)


1
เพียงแค่กดจุดของ mipadi เมื่อคุณเปรียบเทียบสตริงคุณจะต้องเปรียบเทียบอักขระทั้งหมดกับแต่ละอักขระ ดังนั้นการเปรียบเทียบสตริงที่เหมือนกันคือ O (n) ในขณะที่สัญลักษณ์ทับทิมเปรียบเทียบแม่มดการอ้างอิงวัตถุคือ O (1)
Jeremy Heiler

ทำไม Python ไม่มีสิ่งนี้?
งาน

คุณควรระวังที่จะไม่ใช้มากเกินไปเพราะเมื่อครั้งสุดท้ายที่ฉันรู้ แต่ฉันไม่ได้ดูสิ่งนี้ในทับทิม> 1.9 สัญลักษณ์ไม่ได้รับ gc'd และสามารถกินความทรงจำได้
frogstarr78

#mySymbolพวกเขาประพฤติกันในสมอลล์ทอล์คยกเว้นพวกเขามีลักษณะเหมือน
Frank Shearar

@ frogstarr78 - ยกเว้นว่าคุณกำลังสร้างสัญลักษณ์แบบเป็นโปรแกรม (การฝึกสตริงโดยไม่ตรวจสอบก่อน) คุณไม่ต้องกังวลกับการสร้างสัญลักษณ์มากเกินไป
Justin L.

16

Symbol in Ruby นั้นเป็นสิ่งเดียวกับสัญลักษณ์ในโลกแห่งความเป็นจริง มันถูกใช้เพื่อแสดงหรือตั้งชื่อบางอย่าง

สัญลักษณ์มักใช้เพื่อแสดงสถานะบางอย่างเช่น

order.status = :canceled
order.status = :confirmed

นอกจากนี้คุณยังสามารถดูสัญลักษณ์ได้ทันที คุณไม่จำเป็นต้องกำหนดสัญลักษณ์คุณเพียงแค่ใช้มัน บทความนี้จะอธิบายในรายละเอียดที่ดี


1
คำอธิบายที่ดีกว่าส่วนใหญ่ฉันดูมาแล้ว
Yuri Ghensev

0

โดยทั่วไปแล้วตัวแปรมักจะสับสนกับสายอักขระ แต่ฉันเข้าใจได้ว่าคุณคิดว่ามันเป็นตัวแปร มันเข้าใจได้ ลองวิธีนี้ดู:

สถานะของผู้เล่นในเกมนั้นมีจำนวน 1 หมายถึงชีวิต 2 หมายถึงไม่แน่ใจ 3 หมายถึงตาย สิ่งนี้สามารถแทนที่ด้วยสัญลักษณ์ได้อย่างง่ายดาย สัญลักษณ์ที่อาจจะเป็นและ:alive :unsure :deadวิธีตรวจสอบว่าผู้เล่นยังมีชีวิตอยู่หรือไม่แทนที่จะทำสิ่งนี้:

if player_status == 1

คุณสามารถทำได้:

if player_status == :alive

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