ความแตกต่างระหว่าง Class และ Klass ในทับทิมคืออะไร?


113

ความแตกต่างระหว่าง Class และ Klass คืออะไร?


1
คุณเห็นหลังที่ไหน
Darin Dimitrov

18
klassมักใช้เพื่อตั้งชื่อตัวแปรที่เก็บClassอ็อบเจ็กต์ (จำคลาสก็คืออ็อบเจกต์เช่นกัน) เช่นเดียวกับในklass = String. คุณสามารถให้แหล่งที่มาของที่ที่คุณเห็นเพื่ออธิบายอย่างละเอียดได้หรือไม่?
Chubas

5
ไม่ฉันไม่ต้องการให้แหล่งที่มาเดียวเพราะฉันไม่ต้องการให้อธิบายแบบนั้น อยากได้ภาพใหญ่กว่านี้
thenengah

5
บางครั้งผู้คนใช้clazzมากกว่าklass(ตัวอย่างเช่นในหนังสือ "Metaprogramming Ruby")
Andrew Grimm

2
ใน TV Tropes จะเรียกสิ่งนี้ว่า "Xtreme Kool Letterz" (ไม่มีลิงก์ - ไม่ปลอดภัยในการผลิต)
Andrew Grimm

คำตอบ:


189

classคือคีย์เวิร์ดที่ใช้กำหนดคลาสใหม่ เนื่องจากเป็นคำหลักที่สงวนไว้คุณจึงไม่สามารถใช้เป็นชื่อตัวแปรได้ คุณไม่สามารถใช้คำหลักใด ๆ ของรูบี้เป็นชื่อตัวแปรดังนั้นคุณจะไม่สามารถที่จะมีตัวแปรชื่อdefหรือmoduleหรือifหรือendฯลฯ - classไม่แตกต่างกัน

ตัวอย่างเช่นพิจารณาสิ่งต่อไปนี้:

def show_methods(class)
  puts Object.const_get(class).methods.inspect
end
show_methods "Kernel"

การพยายามเรียกใช้ทำให้เกิดข้อผิดพลาดเนื่องจากคุณไม่สามารถใช้classเป็นชื่อตัวแปรได้

test.rb:1: syntax error, unexpected kCLASS, expecting ')'
    def show_methods(class)
                          ^
test.rb:2: syntax error, unexpected ')'
      puts Object.const_get(class).methods.inspect

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

def show_methods(klass)
  puts Object.const_get(klass).methods.inspect
end

show_methods "Kernel"

ผลลัพธ์ตามที่คาดไว้คือ

["method", "inspect", "name", "public_class_method", "chop!"...

คุณสามารถใช้ใด ๆ (ที่ไม่ใช่ลิขสิทธิ์) ชื่อตัวแปรมี klassแต่ชุมชนได้นำตัวไปใช้ มันไม่มีเวทมนตร์พิเศษใด ๆ - แค่แปลว่า "ฉันต้องการใช้ชื่อ 'คลาส' ที่นี่ แต่ฉันทำไม่ได้เนื่องจากเป็นคีย์เวิร์ดที่สงวนไว้"

หมายเหตุด้านข้างเนื่องจากคุณพิมพ์ผิดไปสองสามครั้งจึงควรสังเกตว่าใน Ruby กรณีมีความสำคัญ โทเค็นที่ขึ้นต้นด้วยอักษรตัวใหญ่เป็นค่าคงที่ ผ่านPickaxe :

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

ดังนั้นการสะกดคำที่ถูกต้องคือclassและklassมากกว่าและClass Klassค่าหลังจะเป็นค่าคงที่และทั้งสองClassและKlassเป็นชื่อคงที่ที่ถูกต้อง แต่ฉันขอแนะนำให้ใช้เพื่อความชัดเจน


7
ไม่เพียง แต่เป็นClassชื่อคงที่ที่ถูกต้องเท่านั้น แต่ยังเป็นชื่อที่ยังหลงเหลืออยู่อีกด้วย! (เป็นคลาสคลาส)
Asherah

1
ว๊าว!! สวยจัง. เข้าใจอย่างสมบูรณ์ตอนนี้ ขอบคุณคริส! :)
thenengah

1
ฉันคิดว่าการใช้klassเป็นตัวแปรท้องถิ่นมาจาก Pickaxe - พวกเขาใช้ชื่อนั้นในสองตัวอย่างด้วยเหตุผลที่คุณอธิบายไว้ที่นี่
Ken Bloom

นี่ต้องใช้ทับทิมรุ่นเก่า ด้วย Ruby 1.9.3 ฉันใช้object_instance.class.name == 'Object'
Augustin Riedinger

ไม่มันยังคงแม่นยำ คลาสของ Object.new คือ Object แต่คลาสของ Object คือ Class
Chris Heald

23

klassนอกจากนี้ยังมีทางรถไฟ (หรือมากกว่า ActiveRecord) วิธีการ ใช้สำหรับรับคลาสของสมาคม

ตามที่ระบุไว้ในเนื้อหาที่เชื่อมโยง:

class Author < ActiveRecord::Base
  has_many :books
end

Author.reflect_on_association(:books).klass
# => Book

12

klassและclazzและและชอบที่มีการสะกดผิดคิดสร้างสรรค์มาใช้ในการรับรอบคำสงวนclaszclass

การใช้class1หรือclหรือclassXหรือบางสิ่งบางอย่างจะกระทบกระเทือนน้อยกว่ามากในสายตามากกว่าการสะกดผิดโดยเจตนา


5

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


ประเด็นคืออะไรฉันหมายถึงทำไม / ใช้อย่างไรมักใช้เพื่ออะไร?
thenengah

3
@Sam class เป็นคีย์เวิร์ดที่สงวนไว้สำหรับกำหนดคลาส ดังนั้นหากคุณต้องการจัดการบางอย่างกับคลาสทั่วไป (เช่น metaprogramming) คุณจะไม่สามารถเขียนclass = Kernel.const_get(class_name)ได้ แต่คุณเขียนklass = Kernel.const_get(class_name)ได้และใช้แทน "คลาส"
Thiago Silveira

2
ประเด็นคือคุณไม่สามารถใช้คีย์เวิร์ด 'class' เพื่อหมายถึง 'class' ได้ ... เพราะมันเป็นคำสงวน (ฉันรู้ตรรกะแบบวงกลม) ดังนั้นคำว่า 'klass' จึงถูกแทนที่แทน นี่เป็นสำนวนทั่วไปในภาษาอื่น ๆ เช่น Java และ C #
Scott

เพื่อให้คุณสามารถกำหนดชั้นเรียนแบบไดนามิก? Klass = object.class; Klass.new - อะไรทำนองนั้น
thenengah

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