在Ruby中删除大写字母的需要为DSL创建

时间:2015-10-29 07:52:04

标签: ruby dsl

我写了一个简单的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

2 个答案:

答案 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