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