在Ruby中对字符串和block求解

http://tech.ddvip.com   2008年01月18日    社区交流

内容摘要:对包含代码的字符串和block求解,是我最钟爱的Ruby特性之一。Ruby提供了多种不同类型的求解方式;不过我最常用的是下面这些:eval、instance_eval和class_eval。

  ContextOne继承自DslContext。DslContext的定义如下。

class DslContext
def self.execute(text)
rules = polish_text(text)
rules.each do |rule|
result = self.new.instance_eval(rule)
yield result if block_given?
end
end
def self.bubble(*methods)
methods.each do |method|
define_method(method) { |args| args }
end
end
def self.polish_text(text)
rules = text.split("
")
rules.collect do |rule|
rule.gsub!(/'.+'/,extract_stakes(rule))
rule << " end"
end
end
def self.extract_stakes(rule)
stakes = rule.scan(/'.+'/).first
stakes.delete!("'").gsub!(%q{$},'dollar').gsub!('-','dash').gsub!(' ','space')
end
def self.sym_to_stakes(sym)
sym.to_s.gsub!('dollar',%q{$}).gsub!('dash','-').gsub!('space',' ')
end
end<

  ContextOne的method_missing方法中使用了List类,List类代码如下。

class List
def self.size_for(stakes)
20
end
end

  ContextOne使用DSL检查每张牌桌的List大小,并在必要的时候发送通知。当然,这只是演示代码,List对象也只不过是stub,以验证ContextOne和DslContext所有的功能都没有问题。这里要重点注意:方法的执行被委托给了instance_eval,这样才能在ContextOne的上下文中对代码进行求解。

责编:豆豆技术应用

正在加载评论...