Ruby 板


LINE

: 推 godfat:為什麼你覺得需要修改 Fixnum..? 12/12 22 : → rexkimta:要用1*Matrix[[1,2],[3,4]]這種型式的語法,不是就應該 12/12 22 : → rexkimta:定義Fixnum*Matrix嗎?不然至少也要修改Numeric? 12/12 22 ok, 因為我沒用過 matrix, 所以不知道這樣可以動。這種時候就是 Use the source, Tux 的時候了。首先我們先翻到 Fixnum#* https://github.com/ruby/ruby/blob/900b4a6db63012d9ce32a1019a7c9d5b014a0047/ numeric.c#L3609 rb_define_method(rb_cFixnum, "*", fix_mul, 1); 所以我們去找 fix_mul 這個 c function: https://github.com/ruby/ruby/blob/900b4a6db63012d9ce32a1019a7c9d5b014a0047/ numeric.c#L2575-2582 這邊可以看到 fix_mul 在 rhs 不是 FIXNUM_P(y) 時,會去 FIXNUM_P(y) 由於什麼都不是,最後會跑到 return rb_num_coerce_bin(x, y, '*'); 接下來就看 rb_num_coerce_bin 是什麼: https://github.com/ruby/ruby/blob/900b4a6db63012d9ce32a1019a7c9d5b014a0047/ numeric.c#L219-224 我們會看到重點是 do_coerce(&x, &y, TRUE); 接著就去看他的定義: https://github.com/ruby/ruby/blob/900b4a6db63012d9ce32a1019a7c9d5b014a0047/ numeric.c#L198-217 在 L206 的地方,可以看到 ruby 又呼叫 coerce_body, 取得某個 array, 並把 lhs 和 rhs 分別替換成這個 coerce_body 回傳的 array 的 first 和 last. 接著看 coerce_body 定義: https://github.com/ruby/ruby/blob/900b4a6db63012d9ce32a1019a7c9d5b014a0047/ numeric.c#L179-183 這裡我們看到,coerce_body 會對 rhs 呼叫 id_coerce, 再查一下 id_coerce https://github.com/ruby/ruby/blob/900b4a6db63012d9ce32a1019a7c9d5b014a0047/ numeric.c#L3540 可以發現其實就是 :coerce, 一個 ruby 的 symbol. 也就是說,他嘗試呼叫 rhs.coerce lhs 套到這裡來,其實就是 Matrix[[1,2],[3,4]].coerce 1 並把其結果重新定為 lhs 和 rhs, 再套 * 上去。 測試一下: Matrix[[1,2],[3,4]].coerce 1 會得到: [#<Matrix::Scalar:0x000001009991d8 @value=1>, Matrix[[1, 2], [3, 4]]] 也就是說,當我們寫: 1 * Matrix[[1,2],[3,4]] 時,ruby 會先看 matrix 不是 numeric, 因此呼叫 Matrix#coerce 1 把 1 改寫成 scalar, 並當作新的 lhs, 再把原本的 matrix 當作 rhs. 在 matrix.rb 中,就可以找到這個 Matrix#coerce 的定義: def coerce(other) case other when Numeric return Scalar.new(other), self else raise TypeError, "#{self.class} can't be coerced into #{other.class}" end end 因此我們可以定義一個 Two class: class Two def coerce lhs [lhs, 2] end end 然後得到 100 * Two.new # => 200 -- By Gamers, For Gamers - from the past Interplay --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.38.235
1F:推 rexkimta:謝謝,上了一課。 12/13 11:22







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP