ruby-inject/eval

最近用到數(shù)組求和比較頻繁晓猛,了解了一下之前沒怎么用過的inject
數(shù)組求和
Inject最常見的用法
[1, 2, 3, 4, 5].inject(0) { |sum, e| sum + e }
=> 15
或者
(1..5).inject(0) { |sum, e| sum + e }
=> 15

用區(qū)間或者數(shù)組在這里沒有分別砸讳,Ruby會(huì)自動(dòng)轉(zhuǎn)換滤愕。Inject在這里接受一個(gè)方法參數(shù)和一個(gè)block. 對數(shù)組中的每一個(gè)元素芋齿,block都執(zhí)行一次梧却。第一次執(zhí)行block的時(shí)候挡毅,inject接收的方法參數(shù)被作為block的第一個(gè)參數(shù),而block的第二個(gè)參數(shù)則是數(shù)組的第一個(gè)元素仑扑。第二次執(zhí)行block的時(shí)候览爵,情況就有了變化,這也是inject神奇的地方夫壁。這時(shí)候block的第一個(gè)參數(shù)則是block上一次執(zhí)行的返回值(block的最后一個(gè)表達(dá)式)拾枣,第二個(gè)參數(shù)則是數(shù)組的第二個(gè)元素,后面的三次執(zhí)行方式與第二次相同,這樣我們就計(jì)算出了數(shù)組元素之和梅肤。事實(shí)上司蔬,上面的代碼還可以更簡潔一些:

[1, 2, 3, 4, 5].inject { |sum, e| sum + e }
=> 15

這段代碼可以計(jì)算出相同結(jié)果的原因是:inject的方法參數(shù)是可選的,如果不提供的話姨蝴,Ruby默認(rèn)將數(shù)組的第一個(gè)元素作為block第一次執(zhí)行時(shí)候的第一個(gè)參數(shù)俊啼,在這種情況下,block一共需要執(zhí)行4次左医,比傳入默認(rèn)參數(shù)的形式少執(zhí)行一次授帕。

轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)
生成Hash:
hash = [[:first_name, 'Shane'], [:last_name, 'Harvie']].inject({}) do |result, element| result[element.first] = element.last
result
end

當(dāng)然這種用法也有別的形式,并不一定需要用到inject浮梢,比如:
Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
2.2 過濾數(shù)組:
arr = [1, 2, 3, 4, 5, 6].inject([]) do |r, e|
r << e.to_s if e % 2 == 0
r
end

當(dāng)然這種用法也有不使用inject的等價(jià)方式:
[1, 2, 3, 4, 5, 6].select { |e| e % 2 == 0 }.collect { |e| e.to_s }
=> ["2", "4", "6"]

(5..10).inject(1) { |product, n| product * n } #=> 151200

longest = %w{ cat sheep bear }.inject do |memo, word| memo.length > word.length ? memo : word end longest #=> "sheep"
求最長的字符串還可以用max方法
a.max { |a, b| a.length <=> b.length } #=> "albatross"

求和還有一個(gè)比較看上去更簡單的方法eval
eval [1,2,3,4].join('+')

Ruby eval方法還可以動(dòng)態(tài)執(zhí)行字符串
a = 1 b="true" c="false" str =" if a==1 then puts '輸出:#跛十' else puts '輸出:#{c}' end " eval(str) => 'true'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秕硝,隨后出現(xiàn)的幾起案子芥映,更是在濱河造成了極大的恐慌,老刑警劉巖远豺,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奈偏,死亡現(xiàn)場離奇詭異,居然都是意外死亡躯护,警方通過查閱死者的電腦和手機(jī)惊来,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棺滞,“玉大人裁蚁,你說我怎么就攤上這事〖烀校” “怎么了厘擂?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锰瘸。 經(jīng)常有香客問我,道長昂灵,這世上最難降的妖魔是什么避凝? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮眨补,結(jié)果婚禮上管削,老公的妹妹穿的比我還像新娘。我一直安慰自己撑螺,他們只是感情好含思,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般含潘。 火紅的嫁衣襯著肌膚如雪饲做。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天遏弱,我揣著相機(jī)與錄音盆均,去河邊找鬼。 笑死漱逸,一個(gè)胖子當(dāng)著我的面吹牛泪姨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饰抒,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼肮砾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了袋坑?” 一聲冷哼從身側(cè)響起仗处,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咒彤,沒想到半個(gè)月后疆柔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镶柱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年旷档,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歇拆。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞋屈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出故觅,到底是詐尸還是另有隱情厂庇,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布输吏,位于F島的核電站权旷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贯溅。R本人自食惡果不足惜拄氯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望它浅。 院中可真熱鬧译柏,春花似錦、人聲如沸姐霍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胯府,卻和暖如春介衔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盟劫。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工夜牡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侣签。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓塘装,卻偏偏與公主長得像,于是被迫代替她去往敵國和親影所。 傳聞我的和親對象是個(gè)殘疾皇子蹦肴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容