Почему XmlMarkup в Ruby Builder использует другой синтаксис для Groovys NodeBuilder - PullRequest
1 голос
/ 14 сентября 2009

Groovys NodeBuilder использует

def someBuilder = new NodeBuilder()

someBuilder.people(kind:'folks', groovy:true) {
  person(x:123,  name:'James', cheese:'edam') {
    project(name:'groovy')
    project(name:'geronimo')
  }
  person(x:234,  name:'bob', cheese:'cheddar') {
    project(name:'groovy')
    project(name:'drools')
  }
}

тогда как Rails 'XmlMarkup использует

xm = Builder::XmlMarkup.new
xm.instruct!                   # <?xml version="1.0" encoding="UTF-8"?>
xm.html {                      # <html>
  xm.head {                    #   <head>
    xm.title("History")        #     <title>History</title>
  }                            #   </head>
  xm.body {                    #   <body>
    xm.comment! "HI"           #     <! -- HI -->
    xm.h1("Header")            #     <h1>Header</h1>
    xm.p("paragraph")          #     <p>paragraph</p>
  }                            #   </body>
}                              # </html>

Почему с Rails вам нужно использовать явный получатель (xm), тогда как с Groovy вы можете его опустить? Я слышал о неприязни к instance_eval в ruby, почему Groovy может сойти с этого стиля, а ruby ​​- нет?

Спасибо капризный , только что закончил читать эту статью, это превосходный обзор различных методов, которые вы можете использовать для создания DSL в ruby. Я бы проголосовал за вас, но пока нет ни одного представителя.

Ответы [ 4 ]

2 голосов
/ 14 сентября 2009

Вот хороший пост в блоге, в котором объясняются различные способы реализации DSL в ruby ​​, а также плюсы и минусы каждого подхода.

1 голос
/ 15 сентября 2009

На этот вопрос нет единого ответа, это вопрос вкуса, не более того. Если вы спрашиваете, может ли Groovy выполнить dsl в Ruby, то да, вы можете использовать method_missing.

1 голос
/ 14 сентября 2009

Две библиотеки имеют разный синтаксис, потому что это разные библиотеки, реализованные на разных языках (насколько я знаю) разными людьми, которые имели схожие, но разные идеи о том, как реализовать DSL для письма (среди прочих). вещи) XML документы.

Или, иначе говоря, они разные, потому что они есть. Я не знаю лучшего способа выразить это.

Стоит отметить, что библиотека Builder не имеет никакого отношения к Rails: это библиотека, реализованная в виде Ruby Gem, и ее можно использовать везде, где есть Ruby, а не только в Rails.

0 голосов
/ 14 сентября 2009

Нет причины, по которой вы не могли бы сделать это в Ruby. Автор этой библиотеки просто не сделал.

...