หลายภาษา มีค่าพิเศษที่แสดงถึงค่าว่าง ๆ หรือแสดงว่าตัวแปรนั้น ๆ ยังไม่ได้ถูกกำหนดค่าอะไรให้ เช่น
- C, C++ มีค่า
NULL
- Java มีค่า
null
- Go มี
nil
ซึ่งใน 4 ภาษาที่กล่าวมา ค่านี้นั้นเป็นค่าที่พิเศษกว่าค่าอื่น ๆ
แต่สำหรับ Ruby นั้นมีค่า nil
เช่นกัน ต่างกันตรงที่ nil
ของ Ruby นั้นก็เป็น Object ธรรมดา ไม่ต่างจากค่าอื่น ๆ ในโลกของ Ruby เลย เพราะโลกของ Ruby นั้น ทุก ๆ ค่าเป็น Object เสมอ :D
ทุก Object ใน Ruby จะต้องระบุได้ว่าเป็น Object ของ Class อะไร เราสามารถใช้ method .class
เพื่อเรียกดูได้ ลองเปิด irb ขึ้นมาแล้วสั่ง nil.class
ก็จะรู้ว่า nil
เป็น Object ของ Class อะไร
~ irb
irb(main):001:0> nil.class
=> NilClass
ซึ่งจริงๆแล้ว nil
เป็น Object ของ NilClass
นั่นเอง
เราสามารถเรียกดู methods ของ Object ได้โดยเรียก method ชื่อ methods
เราก็เรียกดู method ของ nil
ได้เช่นกัน แบบนี้
~ irb
irb(main):001:0> nil.methods
=> [:to_h, :&, :to_c, :inspect, :===, :to_s, :to_f, :=~, :to_i, :to_a, :to_r, :rationalize, :nil?, :|, :^, :dup, :itself, :yield_self, :then, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :singleton_class, :clone, :display, :hash, :class, :method, :public_method, :public_send, :singleton_method, :define_singleton_method, :extend, :to_enum, :enum_for, :<=>, :!~, :eql?, :respond_to?, :freeze, :object_id, :send, :__send__, :!, :==, :__id__, :!=, :equal?, :instance_eval, :instance_exec]
เราลองมาใช้พวก method to_*
เพื่อแปลงค่า nil
เป็นค่าอื่น ๆ ได้เช่น
irb(main):003:0> nil.to_h # แปลงเป็น Hash
=> {}
irb(main):004:0> nil.to_i # แปลงเป็น Integer
=> 0
irb(main):005:0> nil.to_a # แปลงเป็น Array
=> []
irb(main):006:0> nil.to_f # แปลงเป็น Float
=> 0.0
สรุปว่า Ruby ออกแบบมาให้ถูกอย่างเป็น Object และแต่ละ Object ก็มี method ให้เราเรียกใช้ การใช้ค็อนเซ็ปนี้ของ Ruby นั้นเอามาใช้กับค่า nil
ด้วยเช่นกัน ไม่ต้องแยก nil
เป็นค่าพิเศษแบบภาษาอื่น ๆ เลย
Top comments (0)