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

Removing the need for capital letter in Ruby create for a 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

我在全局范围内使用它修复了它

def method_missing(name, *args, &block)
    name.to_s == "pizza"? name.to_s : super
end

@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