最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ruby中相等性判斷的4種方法

 更新時(shí)間:2015年03月23日 09:44:06   投稿:junjie  
這篇文章主要介紹了Ruby中相等性判斷的4種方法,本文講解了“==” 最常見的相等性判斷、“===” 用于 case 語句的相容判斷、“equal?” 相同對象判斷、“eql?” 對象 hash 值判斷等內(nèi)容,需要的朋友可以參考下

很早就知道 ruby 有 4 種相等性判斷方法,分別是:“==”,“===”,“equal?” 和 “eql?”,平常程序中都有使用,但是感覺對其缺乏深入理解,今天讀 rails 部分源碼的時(shí)候拿捏不定其中一個(gè)判斷的意思,于是趁機(jī)深入研究了一番,總算覺得比較清楚了,今天做一下筆記,以作備忘。

“==” 最常見的相等性判斷

“==” 使用最頻繁,它通常用于對象的值相等性(語義相等)判斷,在 Object 的方法定義中,“==” 比較兩個(gè)對象的 object_id 是否一致,通常子類都會重寫覆蓋這個(gè)方法,通過比較內(nèi)部值來判斷對象是否相等。

比如 ActiveRecord::Base 對 “==” 的定義

復(fù)制代碼 代碼如下:

  def ==(comparison_object)
    super ||
      comparison_object.instance_of?(self.class) &&
      id.present? &&
      comparison_object.id == id
  end

通過 model 的 id 屬性比較兩個(gè) ActiveRecord::Base 實(shí)例是否相等。

“===” 用于 case 語句的相容判斷

“===” 主要用于 case 語句中對象的相容比較,看代碼比較容易理解。

復(fù)制代碼 代碼如下:

def what_is(obj)
  case obj
    when /abc/
      puts "include abc"
    when 3..5
      puts "in 3..5"
    when Symbol
      puts "It is a symbol"
    else
      puts "unkonwn"
  end
end

what_is("abcde") # =>  "include abc"
what_is(4)       # =>  "in 3..5"
what_is(:a)      # =>  "It is a symbol"
what_is(100)     # =>  "unknown"

case 背后是拿每一個(gè) when 后面的對象與 obj 進(jìn)行 === 方法計(jì)算比較,比如上面的代碼就是 分別求 /abc/.===(obj) , (3..5).===(obj) , Symbol.===(obj) 。

關(guān)鍵得看 === 方法里如何定義, Class 類中, === 定義為 obj.is_a?(klass),所以 case 可以現(xiàn)實(shí) obj 的類型判斷。

特別要注意的是和其他相等判斷不同 “===” 通常沒法交換,也就是很可能 a.===(b) != b.===(a) ,比如 /abc/ === "abcd" 為 true,但 "abcd" === /abc/ 為 false。

“equal?” 相同對象判斷

“equal?” 其實(shí)是最簡單的,但是也是最容易讓人搞混的判斷。說它簡單是因?yàn)檫@個(gè)方法的語義是比較兩個(gè)對象是否相同(是否有相同的 object_id),Object 的方法適用所有對象,不應(yīng)該對其重寫覆蓋。說它容易讓人搞混,是因?yàn)?ruby 和 java 中 “==” 和 “equal?” 方法的語義正好是相反的,ruby 中 “equal?” 表示對象引用相同,而 java 表示對象值相同。

“eql?” 對象 hash 值判斷

eql? 用于對象 hash 值判斷,如果兩個(gè)對象的 hash 值相等,就返回 true,否則返回 false。Object 的定義里,“eql?” 和 “==” 是等價(jià)的。通??梢园?“eql?” 看作比 “==” 更嚴(yán)格的相等,比如:

復(fù)制代碼 代碼如下:

1 == 1.0     #=> true
1.eql? 1.0   #=> false

相關(guān)文章

  • Ruby中操作文件的方法介紹

    Ruby中操作文件的方法介紹

    這篇文章主要介紹了Ruby中操作文件的方法介紹,是Ruby學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • 舉例初步講解Ruby中的正則表達(dá)式

    舉例初步講解Ruby中的正則表達(dá)式

    這篇文章主要介紹了Ruby中的正則表達(dá)式,是Ruby學(xué)習(xí)進(jìn)階當(dāng)中的重要知識,需要的朋友可以參考下
    2015-05-05
  • 在Ruby程序中連接數(shù)據(jù)庫的詳細(xì)教程

    在Ruby程序中連接數(shù)據(jù)庫的詳細(xì)教程

    這篇文章主要介紹了在Ruby程序中連接數(shù)據(jù)庫的詳細(xì)教程,包括介紹數(shù)據(jù)庫支持Ruby的接口等,是學(xué)習(xí)Ruby on Rails的基礎(chǔ),需要的朋友可以參考下
    2015-04-04
  • 編寫Ruby代碼注釋時(shí)需要注意的一些問題

    編寫Ruby代碼注釋時(shí)需要注意的一些問題

    這篇文章主要介紹了編寫Ruby代碼注釋時(shí)需要注意的一些問題,特別是在團(tuán)隊(duì)協(xié)作時(shí)好的注釋能大大增加代碼的可讀性,需要的朋友可以參考下
    2015-08-08
  • Ruby中的迭代器詳解

    Ruby中的迭代器詳解

    這篇文章主要介紹了Ruby中的迭代器詳解,本文講解了字符串、數(shù)字、數(shù)組、Map、文件、目錄等情況下使用迭代器的例子,需要的朋友可以參考下
    2014-09-09
  • 最新評論

    德保县| 邵武市| 汝州市| 增城市| 应城市| 太保市| 广州市| 尉氏县| 游戏| 石首市| 蓝田县| 湖口县| 岳池县| 读书| 平湖市| 雷波县| 冕宁县| 民丰县| 玛沁县| 静宁县| 合阳县| 开阳县| 永德县| 台南市| 新巴尔虎右旗| 云龙县| 舟曲县| 富平县| 阳东县| 安泽县| 鄂温| 周至县| 四川省| 孝昌县| 平谷区| 溆浦县| 黑山县| 嘉黎县| 永吉县| 广元市| 隆林|