我正在嘗試將選擇器存盤在分配給適當主題的哈希中,然后我將從網頁中抓取這些主題。但是,當我這樣做時,我遇到了“css”方法的“未定義方法”錯誤。
例子:
@@letters_hash = {
"a" => {
uppercase: "A",
history: css('div.class_1').css('div.class_2').text,
url: "www.alphabet.com"
}
}
有沒有辦法封裝這個?或者,如果我將其存盤為字串,有沒有辦法洗掉字串并將其回傳到方法中?
感謝您的時間。
uj5u.com熱心網友回復:
css('div.class_1').css('div.class_2').text是self.css('div.class_1').css('div.class_2').text并且self是你的Database班級。它沒有css方法。您需要在具有諸如 Nokogiri 節點之類的 css 方法的東西上呼叫該方法。
回呼
如果你想存盤一組方法來呼叫你稍后會得到的某個 Nokogiri 節點,你可以使用一個叫做 lambda 的匿名函式進行回呼。
@letters = {
"a" => {
uppercase: "A",
history: ->(node) { node.css('div.class_1').css('div.class_2').text },
url: "www.alphabet.com"
}
}
這需要一個節點作為引數并呼叫節點上的方法。
然后稍后當你有一個節點時,你可以呼叫這個函式。
@letters_hash[letter][:history].call(node)
物件
在這一點上,它正在被編譯并且應該被封裝在一個物件中。
class LetterTopic
def initialize(letter)
@letter = letter
end
def node_history(node)
node.css('div.class_1').css('div.class_2').text
end
def uppercase
@letter.upcase
end
def url
"www.alphabet.com"
end
end
letters = {
"a" => LetterTopic.new("a")
}
node = ...get a Nokogiri node...
letters[letter].node_history(node)
關于類變數的注釋
@@letters_hash 不按你的想法做。Ruby 中的類變數由子類共享。如果您將資料庫子類化,它們將共享一個@@letters_hash變數。
class Database
@@letters = {}
def self.letters
@@letters
end
end
class Databasement < Database
end
Database.letters[:a] = 'database'
Databasement.letters[:a] = 'databasement'
p Database.letters # {:a=>"databasement"}
p Databasement.letters # {:a=>"databasement"}
相反,使用類實體變數。與 Ruby 中的其他所有內容一樣,Database 類是一個物件,并且可以擁有自己的實體變數。
class Database
# Everything inside `class << self` works on the class object.
class << self
def letters
@letters ||= {}
end
end
end
class Databasement < Database
end
Database.letters[:a] = 'database'
Databasement.letters[:a] = 'databasement'
p Database.letters # {:a=>"database"}
p Databasement.letters # {:a=>"databasement"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/410175.html
標籤:
