Crystal позволяет использовать ключевое слово with
для улучшения DSL.
Но в своей стандартной библиотеке он не используется для JSON :: Builder, пример из документации выглядит так:
JSON.build do |json|
json.object do
json.field "name", "foo"
end
end
Хотя это можно было бы записать короче:
JSON.build do
object do
field "name", "foo"
end
end
Итак, почему это не реализовано таким образом? Есть ли недостатки в использовании with xxx yield
?
Возможная реализация
class JSON
def self.build
with JSON.new yield
end
def object
builder = JSONObject.new
with builder yield self
p builder.result
end
class JSONObject
getter :result
@result = Hash(String, String).new
def field(key : String, value : String)
@result[key] = value
end
end
end