請問如何看懂 rodc & gem 的使用方法?


#1

ruby 有很多好用的 gem…

想請問如何看懂官網的文件來用 ??

e.g.

我想要使用 Mechanize … (一個爬蟲的 gem. )
http://www.rubydoc.info/gems/mechanize/Mechanize

爬蟲在之前有請教過…有二個階段 … 一個是 spider捉回來再回來 parser 處理…

官網都有繼承的說明…

e.g. Mechanize < Object, File < Object …

開始實做遇到的問題…

Step 1. 先new一個 instance 出來準備捉…

agent = Mechanize.new

Step 2. 開始填表單 …

捉表單的位置
form = agent.get (‘xxxxx’).forms[xx] 網址…之類的…
此時的 from.class 為 Mechanize::Form 之類的…

假設我要送出表單…含有 hidden code …或一些其它 Mechanize 的次模組(or class)…

我要如何去使用 ??

其實想問的就是 (這應該是 ruby…的問題吧…)

一個 gem 他有很多的繼承性之類的…

他的方法(method)如何在各繼承性之間做轉換使用 ??
…當然以上的例子可能有羅輯錯誤…

就想請教如何利用 gem 的 doc 學會使用其相關 method…

謝謝…


#2

你錯邊了…我說,gems建議直接找github而非純doc,因為doc內不一定有相對的解釋之類的

https://github.com/sparklemotion/mechanize

上面的 link,link 裡面有 EXAMPLE

http://docs.seattlerb.org/mechanize/EXAMPLES_rdoc.html

而github內也有example也就是你要的東西了,包括你的使用者情境之類的


#3

腰瘦哦…

ruby doc 還這樣哦…

ruby doc 一般比較沒在管就是了…

一般寫 gem 的都會放 github 就是了…

那A安捏…

多謝


#4

再接下來想問說怎使用…

http://docs.seattlerb.org/mechanize/

來說…

假設我目前的變數(instance variable)的 class 在 HTTP… 我想要使用 HTTP::Agent 下的方法…要如何使用?? (舉個例子而以…)因為是下一層的 method (沒有繼承上一層…)…很多 ruby 的 gem 文件都這樣…不太會使用呢…(是要自已用繼承去使用嗎?)
e.g. @a = HTTP.new

class XX < HTTP::Agent
@a = ooo #do something
end

是像這用使用嗎?

thx


#5

Ruby 下操作很多東西,其實到最後總歸只剩下一種方式,也就是鴨子型別 X"D…這招很會用的人通常 Ruby 都玩得很好才是

來源:「當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。」,然後我再補充些,所以你只要補上『走 / 游泳 / 叫』,讓這些動作是鴨子的行為即可,別人才不管是不是仿生獸還是噴火龍

簡單的來說拿來用還有被人家用就對了,缺了東西就補(常數 / method ),至於其他的用法就要看 doc / demo / source code 怎樣寫之類的,類似去拆他原本的 code 看流程大概是怎樣跑,然後生個對應的東西給它跑起來,大概就這樣子而已 簡單的來說,你想辦法把你物件對外的東西(常數 / method )打成和它要用的一樣即可,而這樣的做法有你上面所寫的繼承,和 Ruby 專用的 mixin / method_missing 都是,而不是像 Java / C# 因為是強型別,除了使用(繼承inheritance / 多型abstract / 介面interface)之外別無他法之類的

另外,如果你要取到一個小物件內部的東西,類似裡面的變數之類的…你可以去取 inspect 看看,而要把裡面 private 的值拿出來看,其實就多蓋個 public method 吐出相關的變數即可,這些都是解包裝的作法之類的,而 Ruby 寫法每個人都不一樣,所以都還是要多方測試才行


#6

嗯恩…

這個比喻易了解…稍為懂了…

換個角度說…

我今天無論用什繼承 or method_mssing 之流的…

我反正就拼出我要的 method / attribute / 繼承…

那怎去知拼的對不對與否…

就在拼的 class 中用 inspect 把要的東西 puts 出來看看對不對…

http://guides.ruby.tw/ruby/accessors.html

如果真有欠或錯誤…就用蓋掉為萬解的招式…觀念就是這樣…是吧…

不管黑貓白貓…會捉老鼠的就是好貓…


#7

yep~ 大概對,所以最後差異只有包得漂不漂亮,寫法符不符合 OOP 的概念而已,當然寫成 FP 也隨便你的,所以對我而言寫 Ruby 非常的自由,想怎樣幹都行

而其實這些特性 Python 也都有,掌握這種心法 duck typing 類的都可以寫得很好才是,包括 JavaScript


#8

那試一下 demo code 來看一下…幫忙看是不是這意思…(mixins…)

假設我要 Mechanize::Cookie , Mechanize::File 的方法…

我可以寫一個class

module Mymoudle1 < Mechanize::Cookie
end

module Mymoudle2 < Mechanize::File
end
class WTF
       include Mymodule1
       include Mymodule2
       def method1(var1,var2...)
          # do Mymodule1/Mymoudle2(Mechanize::Cookie, Mechanize::File)的方法..
       end
end

method1 就可以用 Mechanize::Cookie, Mechanze::File 的方法了…
要有衝突的就用蓋掉method(if you want to…)

是這樣做嗎?


#9

A…Mechanize的東西不是這樣用的啦,就照它的 demo 來玩就好了,沒必要繼承與使用的

生cookie給你 => Mechanize::Cookie

所以會自動用特別的class給你,而你該做的應該是把流程做好即可


#10

dear jc…

我知道 mechanize 不是這樣…

我只是做個方式(假設考慮層級…不是考慮這個 gem)…

是這樣使用 duck-type 的感覺嗎??..(使用各層級的 method.)


#11

大概算是吧,anyway有這個概念多玩玩就知道了 :slight_smile: