论坛首页 编程语言技术论坛

[Ruby DSL] 三言两语

浏览 6358 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (1) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-10-12   最后修改:2009-10-12
1. 一个简单的web服务器
port 2001

respond :resource=>"/hello" do  |request, response|
  response.body = "hello"
end



当然,你可以一口气开两个

port 2001
respond :resource=>"/hello"{........}

port 2002
respond :resource=>"/hello"{........}


如何实现?参见:http://jroller.com/rolsen/entry/building_a_dsl_in_ruby1


2. 你也可以这么来加数据
add_user {
  name “Charles”
  password “hello123”
  privileges normal
}

如何实现?
def add_user (&block)
  u = User.new
  # User class has name, password, privileges methods
  u.instance_eval(&block) if block_given?
end



3.Rake 或许这个是你最熟悉的
  namespace :db
    task "..." do
    end
  end



4.还有这个 Rails Routes
引用

  ActionController::Routing::Routes.draw do |map|
    map.connect '',:controller => "home",:action => 'index'
  end


如何实现?
参见 actionpack-2.3.3\lib\action_controller\routing\*.rb
第一步:Routes只是ActionController::Routing的一个变量,后者是个module
module ActionController
    module Routing
      Routes = RouteSet.new
    end
end


RouteSet的draw方法只是把Mapping放进去作参数:
class RouteSet
  class Mapper
   ....
   def connect(path, options = {})
     @set.add_route(path, options)
   end
  end
  
  def draw
    yield Mapper.new(self)
    ....
  end
end
   发表时间:2009-10-12  
dsl发展下去会变成天网吗?
0 请登录后投票
   发表时间:2009-10-12   最后修改:2009-10-12
class Program
{
    static void Main(string[] args)
    {

        /*if (args.Length == 0)
        {
            Console.WriteLine(
              "Usage: simplehost filename [querystring]");
            return;
        }
        string file = args[0];
        string query = (args.Length > 1) ? args[1] : "";*/

        MySimpleHost msh = (MySimpleHost)
            ApplicationHost.CreateApplicationHost(
                typeof(MySimpleHost), "/", 
                Directory.GetCurrentDirectory());
        msh.ProcessRequest(file, query);
    }
}

public class MySimpleHost : MarshalByRefObject
{
    public void ProcessRequest(string file, string query)
    {
        SimpleWorkerRequest swr = 
            new SimpleWorkerRequest(file, query, Console.Out);
        HttpRuntime.ProcessRequest(swr);
    }
}


DSL不DSL无所谓,第一个那个也叫web server,这段C#可比它强多了
0 请登录后投票
   发表时间:2009-10-12  

楼上真会扯淡,哪里强了?是代码更好看还是跨平台更容易?
0 请登录后投票
   发表时间:2009-10-12  
static void Main(string[] args) 这么恶心的东西就不要拿出来丢人现眼了
0 请登录后投票
   发表时间:2009-10-12   最后修改:2009-10-12
下一站,火星 写道

楼上真会扯淡,哪里强了?是代码更好看还是跨平台更容易?


愚昧,你支持个web service给我看看啊,这不是比你强的地方
0 请登录后投票
   发表时间:2009-10-12  
ray_linn 写道
下一站,火星 写道

楼上真会扯淡,哪里强了?是代码更好看还是跨平台更容易?


愚昧,你支持个web service给我看看啊,这不是比你强的地方


你还活在web service的年代啊?知道restful不?http+xml就能搞定web service的需求,看看阿里平台的api吧
0 请登录后投票
   发表时间:2009-10-12  
大姨妈,不知道sinatra不是你的错,出来丢人现眼就大错特错了
0 请登录后投票
   发表时间:2009-10-12  
花花公子 写道
大姨妈,不知道sinatra不是你的错,出来丢人现眼就大错特错了


不是号称要用ruby写么,怎么又call起module了?
0 请登录后投票
   发表时间:2009-10-12  
ray_linn 写道
花花公子 写道
大姨妈,不知道sinatra不是你的错,出来丢人现眼就大错特错了


不是号称要用ruby写么,怎么又call起module了?

我靠,有module不能用,那标准库怎么算啊?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics