DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

ใน Ruby ค่า nil เป็นแค่ Object นึง

หลายภาษา มีค่าพิเศษที่แสดงถึงค่าว่าง ๆ หรือแสดงว่าตัวแปรนั้น ๆ ยังไม่ได้ถูกกำหนดค่าอะไรให้ เช่น

  • 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
Enter fullscreen mode Exit fullscreen mode

ซึ่งจริงๆแล้ว 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]
Enter fullscreen mode Exit fullscreen mode

เราลองมาใช้พวก 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
Enter fullscreen mode Exit fullscreen mode

สรุปว่า Ruby ออกแบบมาให้ถูกอย่างเป็น Object และแต่ละ Object ก็มี method ให้เราเรียกใช้ การใช้ค็อนเซ็ปนี้ของ Ruby นั้นเอามาใช้กับค่า nil ด้วยเช่นกัน ไม่ต้องแยก nil เป็นค่าพิเศษแบบภาษาอื่น ๆ เลย

Top comments (0)