Sự khác biệt giữa Class và Klass trong ruby ​​là gì?


112

Sự khác biệt giữa Class và Klass là gì?


1
Bạn đã thấy cái sau ở đâu?
Darin Dimitrov

18
klassthường được sử dụng để đặt tên cho một biến chứa một Classđối tượng (hãy nhớ các lớp cũng là đối tượng), như trong klass = String. Bạn có thể cung cấp nguồn nơi bạn đã xem nó để được giải thích sâu hơn không?
Chubas

5
Không, tôi không muốn cung cấp một nguồn duy nhất vì tôi không muốn nó được giải thích như vậy. Tôi muốn có một bức tranh lớn hơn về điều này
thenengah

5
Đôi khi, mọi người sử dụng clazzhơn là klass(ví dụ, trong cuốn sách "Metaprogramming Ruby").
Andrew Grimm

2
Trong TV Tropes, điều này được gọi là "Xtreme Kool Letterz" (không có liên kết - không an toàn về năng suất).
Andrew Grimm

Câu trả lời:


188

classlà một từ khóa dùng để định nghĩa một lớp mới. Vì nó là một từ khóa dành riêng nên bạn không thể sử dụng nó như một tên biến. Bạn không thể sử dụng bất kỳ từ khóa nào của Ruby làm tên biến, vì vậy bạn sẽ không thể có các biến có tên defhoặc modulehoặc ifhoặc end, v.v. - classcũng không khác gì.

Ví dụ, hãy xem xét những điều sau:

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

Cố gắng chạy điều này dẫn đến lỗi, vì bạn không thể sử dụng classlàm tên biến.

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

Để khắc phục, chúng tôi sẽ sử dụng số nhận dạng klassđể thay thế. Nó không đặc biệt, nhưng nó thường được sử dụng như một tên biến khi bạn đang xử lý một lớp hoặc tên lớp. Nó giống nhau về mặt ngữ âm, nhưng vì nó không phải là một từ khóa dành riêng, nên Ruby không có vấn đề gì với nó.

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

show_methods "Kernel"

Đầu ra, như mong đợi, là

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

Bạn có thể sử dụng bất kỳ tên biến (không dành riêng) nào ở đó, nhưng cộng đồng đã sử dụng klass. Nó không có phép thuật đặc biệt nào - nó chỉ có nghĩa là "Tôi muốn sử dụng tên 'class' ở đây, nhưng tôi không thể, vì nó là một từ khóa dành riêng".

Một lưu ý nhỏ, vì bạn đã gõ sai một vài lần, nên cần lưu ý rằng trong Ruby, trường hợp là vấn đề. Các mã bắt đầu bằng chữ in hoa là hằng số. Qua Pickaxe :

Một tên hằng bắt đầu bằng một ký tự hoa, theo sau là các ký tự tên. Tên lớp và tên mô-đun là hằng số và tuân theo các quy ước đặt tên không đổi. Theo quy ước, các biến hằng số thường được viết bằng chữ hoa và dấu gạch dưới xuyên suốt.

Do đó, cách viết đúng là classklass, thay vì ClassKlass. Cái sau sẽ là hằng số và cả hai ClassKlassđều là những tên hằng hợp lệ, nhưng tôi khuyên bạn không nên sử dụng chúng cho mục đích rõ ràng.


7
Chà, không chỉ Classđặc biệt là một tên hằng hợp lệ, nó còn là một tên còn tồn tại! (đó là lớp Class)
Asherah

1
Wow, đẹp. Hoàn toàn hiểu ngay bây giờ. Cảm ơn Chris! :)
thenengah

1
Tôi nghĩ rằng việc sử dụng klassnhư một biến cục bộ bắt nguồn từ Pickaxe - họ đã sử dụng tên đó trong một vài ví dụ, vì chính xác những lý do bạn đã mô tả ở đây.
Ken Bloom

Điều này phải áp dụng phiên bản ruby ​​cũ. Với Ruby 1.9.3 Tôi sử dụngobject_instance.class.name == 'Object'
Augustin Riedinger

Không, nó vẫn chính xác. Lớp của Object.new là Đối tượng, nhưng lớp của Đối tượng là Lớp.
Chris Heald

22

klasscũng là một phương thức Rails (hay đúng hơn là ActiveRecord) . Nó được sử dụng để lấy lớp của một liên kết.

Như đã nêu trong nội dung được liên kết:

class Author < ActiveRecord::Base
  has_many :books
end

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

12

klassclazzclaszvà những thứ tương tự là những lỗi chính tả sáng tạo được sử dụng để xoay quanh một từ dành riêng class.

Nó sẽ ít chói tai trên mắt để sử dụng class1hoặc clhoặc classXhoặc một cái gì đó chứ không phải là một lỗi chính tả có chủ ý.


5

Một là tên của một lớp và một là một hằng số không xác định theo mặc định. Và đối với cặp mà bạn có nhiều khả năng thấy hơn, classklasscặp trước là một từ khóa để xác định các lớp trong khi cặp sau chỉ là một định danh (giống như bất kỳ chuỗi ký tự nào khác). Nó được sử dụng khi bạn muốn viết từ "class" nhưng không thể vì nó là từ khóa dành riêng.


Ý tôi là tại sao / cách sử dụng nó, nó thường được sử dụng để làm gì?
thenengah

3
@Sam lớp là một từ khóa dành riêng để định nghĩa các lớp. Vì vậy, nếu bạn muốn xử lý một cái gì đó với một lớp chung chung (như lập trình siêu mẫu), bạn không thể viết class = Kernel.const_get(class_name). Nhưng bạn có thể viết klass = Kernel.const_get(class_name), và nó được sử dụng để đại diện cho "lớp".
Thiago Silveira

2
Vấn đề là bạn không thể sử dụng từ khóa 'class' để có nghĩa là 'lớp' ... bởi vì nó là một từ dành riêng (logic vòng tròn, tôi biết) nên từ 'klass' được thay thế. Đây là một thành ngữ phổ biến trong nhiều ngôn ngữ khác, ví dụ như Java và C #.
Scott

để bạn có thể tự động gán lớp? Klass = object.class; Klass.new - một cái gì đó như thế
thenengah

3
@Sam: Sử dụng Klasscho điều đó sẽ là một lựa chọn tồi, vì số nhận dạng bắt đầu bằng chữ hoa là hằng số, vì vậy bạn chỉ có thể đặt nó một lần. Nhưng có, đó là ý tưởng chung.
Chuck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.