我写了一个简单的DSL,可以使用如下调用:
create Pizza do
spread cheese
spread sauce
toppings shoes, jalapeno, apples
bake
end
我想删除大写的P以使这个调用更清洁,但我找不到一种方法来实现这一点。
这是我的PizzaBuilder.rb代码
class PizzaIngredients #factory
def initialize
@@order = {}
end
def method_missing(name, *args, &block)
name.to_s
end
def spread (spread)
@@order[:spreads] ||= []
@@order[:spreads] << spread
end
def bake
@@order
end
def create (pizza)
"making the #{pizza}"
end
def toppings (*toppingList)
@@order[:toppings] ||= []
@@order[:toppings] += toppingList
end
end
module Pizza #smokestack
@order = []
def self.order
@order
end
def self.create(&block)
pizza = PizzaIngredients.new
pizza.instance_eval(&block)
end
end
def create (param, &block)
Pizza.create(&block)
end
答案 0 :(得分:1)
@suavocado - 大写字母是全世界Ruby程序员使用的约定的一部分......
常量以大写字母开头。变量使用小写字母......这是我们编码方式和设计方式的一部分....
这些约定被硬编码到Ruby interperter中。
尝试以下代码并亲眼看看:
class Pizza
def self.test
"hello!"
end
end
Object.const_set 'Pita', Pizza # => okay
Object.const_set 'pizza', Pizza # => error
正如上面提到的一些评论,您可以使用符号而不是DSL的常量,即
create :pizza do
# ...
end
答案 1 :(得分:0)
我在全球范围内使用它来修复它
def method_missing(name, *args, &block)
name.to_s == "pizza"? name.to_s : super
end