Какое обозначение делителя используется (например) в Hpricot? - PullRequest
2 голосов
/ 24 января 2011

В документах Hpricot (в https://github.com/hpricot/hpricot) есть метод doc.search (). Затем в документах говорится: «Ярлык - это использование делителя»:

(doc/"p.posted")

Это работает, это точно, но мне интересно, что это за обозначение? Я никогда не сталкивался с этим раньше.

Ответы [ 3 ]

4 голосов
/ 25 января 2011

Hpricot (и Nokogiri, потому что он поддерживает ярлыки Hpricot) поддерживает два метода ярлыка для «поиска», (/) и «в» (%).

Search означает «найти»все вхождения этого паттерна "и at означает поиск первого вхождения.Search возвращает список узлов, в то время как at возвращает один узел, о котором вы должны помнить, когда хотите получить доступ к содержимому узла.

Как правило, at подходит длятеги или идентификаторы, которые, как вы знаете, уникальны и не хотят повторяться.Search предназначен для обхода всех строк таблицы или каждого тега <p> в документе.Вы также можете создать цепочку из %, которая полезна для поиска определенного узла, а затем спуститься в него.

require 'hpricot'

html = '
<html>
  <head><title>blah</title>
  <body>
    <div id="foo">
      <p>paragraph1</p>
      <p>paragraph2</p>
    </div>
  </body>
</head>
'
doc = Hpricot(html)

doc.at('title').inner_text  # => "blah"
(doc / 'p').last.inner_text # => "paragraph2"
(doc % 'p').inner_text # => "paragraph1"
(doc % '#foo').search('p').size # => 2

Лично я рекомендую Nokogiri поверх Hpricot.Он поддерживает все ярлыки, но более полнофункциональный и очень хорошо поддерживается.

И ярлыки / и % не являются частью какого-либо стандарта, который я видел;Они местны для Hpricot и были унаследованы Nokogiri для удобства.Я не помню, чтобы их видели в парсерах Perl или Python.

3 голосов
/ 24 января 2011

Нотация, вероятно, предназначена для вызова XPath с использованием перегруженного оператора /:

/ выбирает корень документа (который всегда является родителем элемента документа)

Оператору нужны два аргумента, а LHS предоставляет контекст перегрузки, поэтому вы должны сказать

doc/"p.posted"

, а не просто

/"p.posted"
2 голосов
/ 24 января 2011

/ - это обычный метод, который можно вызывать в стиле инфикса:

>> 8 / 2 #=> 4
>> 8./ 2 #=> 4

Просто определите один для своих собственных классов:

>> class Myclass
..   def /(n)
..     "Yeah" * n
..     end
..   end #=> nil
>> Myclass.new / 5 #=> "YeahYeahYeahYeahYeah"
...