Ruby下的 ||= , ! , ? , = , == , !=


#1

這邊是很簡單的教學,有程式概念的大概可以輕鬆的略過上半部分就是,下半部分講的是Ruby的實作關連性

首先是一個等於

x = y

這個=是指定運算,如果為基本型別,則複製該數值,如果為物件,則x將複製y的 pointer

再來是||=

x ||= 123
x = 123 unless x

兩段語法相等,簡單的來說||=可以快速方便的來做檢查與變數的 initialize,很多地方都用得到

再來是最基本的boolean運算,大多數語言應該都會有的,類似

true || false #or
true && false #and
! true #not

所以如果在一個事物前面加上!(not) 則帶表示做 boolean 運算(當然你可以連做兩次變成!!),然而 Ruby 下只有兩種東西為 false,也就是false & nil,做完 not 運算後結果一定為 boolean 值

再來是大部分語言應該都會有的三元運算式,類似

x ? "x is true" : "x is false"
if x ; "x is true" ; else ; "x is false" ; end

兩個語法等價

okay…以上為基本教學…


Ruby下專用的? , ! , = , == , !=用於 method name 的定義與 coding style

def return_boolean?
end
def do_someting_cant_reverse!
end

method 命名時尾末如果有?,則回傳為boolean,類似cat.happy? , baby.crying?,或是Ruby下很常見的empty? , nil?

method 命名時尾末如果有!,則代表"不可逆",或是"質變",這類的用法很多,簡單解釋,類似Ruby的Stringgsubgsub!

x = '112233'
y = x
x.object_id #=> 70287035054800 #object_id相同為相同物件
y.object_id #=> 70287035054800

z = x.gsub('1' , '9')
x #=> '112233'
y #=> '112233'
z #=> '992233'
x.object_id #=> 70287035054800
y.object_id #=> 70287035054800
z.object_id #=> 70287027104020

z = x.gsub!('2' , '8')
x #=> '118833'
y #=> '118833'
z #=> '118833'
x.object_id #=> 70287035054800
y.object_id #=> 70287035054800
z.object_id #=> 70287035054800

這是很重要的概念,一般的 method(沒有!)回傳結果值通常都會包裝另外一個物件回去,而有!的則會把原來的物件內容作修改,因為 x , y 參照的物件都相同,所以用了有!的method,會連同y都修改到,當然!的命名還有另外一個意思,也就是"你確定要這樣做嗎?",在Rails下也非常常見,類似lock! , save!,因為會牽扯到資料庫的 lock,有提示和警示的意味在

再來是Ruby的 getter / setter 與判斷 method

class Cat
  def name= (source)
    return @name = source
  end
  def name
    return @name
  end
end
black_cat = Cat.new
black_cat.name = 'kuro'
white_cat = Cat.new
white_cat.name = 'shiro'
black_cat.name #=> 'kuro'
white_cat.name #=> 'shiro'

很簡單的 getter / setter 範例,有=的後面通常會接一個值,來做儲存的動作,而通常也會有同名個值,來做該值的取回

然而Ruby下有合併的作法,叫做accessor

class Cat
  attr_accessor :name #getter & setter
  #attr_reader :name #only getter
  #attr_writer :name #only setter
end
colorful_cat = Cat.new
colorful_cat.name = 'nyanko sensei'
colorful_cat.name #=> 'nyanko sensei'

大概就method的自動產生器而已就是…

最後是比對類的method

class Wtf
  def ==(source)
    return !source
  end
  def !=(source)
    return !source
  end
end
wtf == true  #=> false
wtf == false #=> true
wtf != true  #=> false
wtf != false #=> true

當然這個 code 沒有任何意義,只是拿來表示== (全等於) 與!= (不等於) 在 Ruby 下只是 method 而已,而回傳值如同?都應該為 boolean 才是

然而以上你高興可以不要這樣做,這些都只是一個命名規則而已,其實不會強迫就是,但不這樣做會造成其他人的困擾,且會顯示 … 你在亂搞,okay 以上


Rails 下的 form method 技法