编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   
  DSL
指数 -> 编程,Ruby. -> 红宝石教程
查看上一个主题 可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
WTD.




 邮政 发布: 2005年12月1日星期四4:52   Post subject: DSLs

快速看看Ruby的力量让您的生活更轻松。

一天的任期是“域特定语言”。在语言的规则中,我们创建一个专门用于解决一个问题的子语言,尽可能容易。

示例问题是在学习过程中定期面对一个程序员。在某些时候,您将想要创建一个具有各种选项的菜单。我们可以每次写出代码,但这会变得繁琐。

红宝石:
班级 问题
    def 自己 . 选项 ( 选项 _text.,&response)
      自己 . 班级 _eval.
          如果 C = instance_variable_get..(“@数数”)
           instance_variable_set.. “@数数”, C + 1
          别的
            c = 0
           instance_variable_set.. “@数数”, C + 1
          结尾            
     
          如果 q = instance_variable_get..(“@选项”)
            q ||= []
            q <<  option_text   
           instance_variable_set.. “@选项”, q
          别的
           instance_variable_set.. “@选项”, [ 选项 _text.]
          结尾
         
          如果 回复
            如果 r = instance_variable_get..(“@Responses”)
               r ||= {}
               r[ C + 1] = response
               instance_variable_set. “@Responses”, r
            别的
               instance_variable_set. “@Responses”, { C + 1 => response}
            结尾
          结尾
      结尾
    结尾
   
    def 自己 . def ault_option.( 选项 _text.,&response)
      自己 . 选项 ( 选项 _text.,&response)
     
      自己 . 班级 _eval.
         instance_variable_set.(“@默认”, instance_variable_get.(“@数数”))
      结尾
    结尾
   
    def 自己 .问题(问题_text.)
      自己 . 班级 _eval.
         instance_variable_set. “@问题”, question_text
      结尾
    结尾
   
    def 自己 .错误信息(err_text.)
      自己 . 班级 _eval.
         instance_variable_set. “@呃” , err_text
      结尾
    结尾
   
    def 自己 .on_select.(&action)
      自己 . 班级 _eval.
         instance_variable_set.(“@on_select”, action)
      结尾
    结尾
   
    def options
      自己 . 班级 .instance_variable_get.(“@选项”)
    结尾
   
    def question
      自己 . 班级 .instance_variable_get.(“@问题”)
    结尾
   
    def error_msg.
      自己 . 班级 .instance_variable_get.( “@呃” )
    结尾
   
    def default_option
      自己 . 班级 .instance_variable_get.(“@默认”)
    结尾
   
    def initialize( 限制= )
      @limit = limit
    结尾
   
    def ask(缩进= 0)
      counter = 0
     options_width =选项。 长度 . to_s. . 长度
      环形
         counter += 1
          put “#{'* indent}#{问题}”
          put
         options.每个_with_index. |option, index|
            put “#{''* indent}#{” “*(options_width - index.to_s.length.)}#{index + 1}。 #{选项}”
          结尾
         
          打印 “#{” “*indent}#{"[#{default_option}]" if default_option}"
         answer_string = 得到
         
         答案= acquess_string =〜/ ^ \ s * $ /? default_option.: answer_string. to_i.
         
          如果 (1 .. 选项. 长度 ). 包括 ?回答
            responses = 自己 . 班级 .instance_variable_get.(“@Responses”)
            responses[ 回答 ]. 称呼 (回答,选择[回答 - 1]) 如果 回应 回应. has_key. ?回答
           
            on_select = 自己 . 班级 .instance_variable_get.(“@on_select”)
            on_select. 称呼 (回答,选择[回答 - 1]) 如果 on_select
           
            休息 answer
          埃莉丝 error_msg. 不是 ( @限制 counter >= @limit)
            put
            put “#{'* indent}#{error_msg}”
            put
          埃莉丝 @限制 counter >= @limit
            休息
          结尾
      结尾
    结尾
结尾


好的,这看起来不太好。幸运的是,这是一次性痛苦,现在当我们想创建一个菜单时......

红宝石:
班级 Q < Question
   question “foo?”
   
   default_option “foo”
   option “酒吧”
   option “Baz”
   
   on_select { | I,O | put o }
   
   error_message “选择另一个”
结尾

问: 新的 .


我们最终结束了:

代码:
foo?

1. foo
2. bar
3. baz
[1] 2
酒吧


任何问题?  微笑
赞助
赞助
 赞助
赞助
从上一个显示帖子:   
    指数 -> 编程,Ruby. -> 红宝石教程
查看上一个主题 告诉一个朋友可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 1 Posts ]
跳到:   


Style:  
搜索: