2012-03-02 44 views
12

Cách tốt nhất để sử dụng đối tượng lớp trong trường hợp câu lệnh là gì? Giả sử tôi có a là phiên bản của lớp Class. Tôi muốn kết hợp nó với các lớp khác nhau. Nếu tôi làmSử dụng đối tượng lớp trong trường hợp câu lệnh

case a 
when String then ... 
when Fixnum then ... 
end 

này sẽ không cung cấp các kết quả dự kiến ​​vì ngay cả khi a == String ví dụ, a === String không phải là sự thật. Cách thông minh để làm điều này là gì?

+1

cùng một chủ đề [tại đây] (http://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements) –

+2

@selman Câu hỏi bạn đã liên kết không liên quan. 'Mục' trong ví dụ đó không phải là một cá thể lớp. – sawa

Trả lời

13

tôi sẽ không sử dụng to_s, vì "String".to_s sẽ "String", vì vậy có lẽ tôi sẽ làm

case 
when a == String then ... 
when a == Fixnum then ... 
end 

hoặc

a = String 

case [a] 
when [String] then puts "String" 
when [Array] then puts "Array" 
end 
+1

Tôi không hiểu tại sao '[]' lừa hoạt động. Nó khá nhiều không chính xác những gì tôi muốn nó. Bạn có thể đưa ra bất kỳ con trỏ nào không? – wrtsprt

-1

Câu trả lời tạm thời của tôi là sử dụng to_s, nhưng tôi không chắc chắn nếu điều này là tốt nhất có thể thực hiện được. Đang chờ câu trả lời tốt hơn.

case a.to_s 
when "String" then ... 
when "Fixnum" then ... 
end 
11

Vấn đề với việc sử dụng một cái gì đó như thế này:

case a.to_s 
when "String" then ... 
when "Fixnum" then ... 
end 

là nó hoàn toàn bỏ lỡ các lớp con, do đó bạn có thể nhận được một cái gì đó là một chuỗi nhưng được bỏ qua bởi chi nhánh đầu tiên của bạn. Ngoài ra, name sẽ là một lựa chọn tốt hơn so với to_s kể từ ngữ nghĩa, bạn đang kiểm tra tên của lớp thay vì biểu diễn chuỗi của nó; kết quả có thể giống nhau nhưng case a.name sẽ rõ ràng hơn.

Nếu bạn muốn sử dụng một case và đối phó với subclassing sau đó bạn có thể sử dụng Module#<= như thế này:

case 
when a <= String then ... 
when a <= Fixnum then ... 
end 

Có, bạn phải lặp lại a trong mỗi when nhưng đó chỉ là cách case công trình.

-1

Array === Array # return false 

và "trường hợp khi "có nghĩa là" === ", vì vậy bạn gặp vấn đề.

Các vấn đề liên quan