婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > ruby元編程實(shí)際使用實(shí)例

ruby元編程實(shí)際使用實(shí)例

熱門標(biāo)簽:柯城手機(jī)地圖如何做地圖標(biāo)注 征服者企業(yè)地圖標(biāo)注 天津外呼系統(tǒng)怎么收費(fèi) 中牟外呼系統(tǒng)違法嗎 漯河電銷 AI電銷機(jī)器人 線路 外呼線路從哪里出來的 巫師3地圖標(biāo)注魔力之所 淮安自動外呼系統(tǒng)供應(yīng)商

很喜歡ruby元編程,puppet和chef用到了很多ruby的語言特性,來定義一個新的部署語言。
分享幾個在實(shí)際項目中用到的場景,能力有限,如果有更優(yōu)方案,請留言給我:)

rpc接口模板化——使用eval、alias、defind_method

require 'rack/rpc'

class Server  Rack::RPC::Server
 def hello_world
  "Hello, world!"
 end

 rpc 'hello_world' => :hello_world
end

上面是一個rpc server,編寫一個函數(shù),調(diào)用rpc命令進(jìn)行注冊。

采用define_method、eval、alias方法,可以實(shí)現(xiàn)一個判斷rpc/目錄下的*.rb文件,進(jìn)行加載和rpc接口注冊的功能,實(shí)現(xiàn)代碼如下:

module RPC
  require 'rack/rpc'
  #require rpc/*.rb文件
  Dir.glob(File.join(File.dirname(__FILE__), 'rpc', "*.rb")) do |file|
   require file
  end
  class Runner  Rack::RPC::Server
   #include rpc/*.rb and regsiter rpc call
   #eg. rpc/god.rb  god.hello
   @@rpc_list = []
   Dir.glob(File.join(File.dirname(__FILE__), 'rpc', "*.rb")) do |file|
    rpc_class = File.basename(file).split('.rb')[0].capitalize
    rpc_list = []
    
    #加載module下的方法到Runner這個類下面
    eval "include Frigga::RPC::#{rpc_class}"
    #獲取聲明的RPC接口
    eval "rpc_list = Frigga::RPC::#{rpc_class}::RPC_LIST"
    rpc_list.each do |rpc_name|
     #alias一個新的rpc方法,叫old_xxxx_xxxx
     eval "alias :old_#{rpc_class.downcase}_#{rpc_name} :#{rpc_name}"

     #重新定義rpc方法,添加一行日志打印功能,然后再調(diào)用old_xxxx_xxxx rpc方法
     define_method "#{rpc_class.downcase}_#{rpc_name}".to_sym do |*arg|
      Logger.info "[#{request.ip}] called #{rpc_class.downcase}.#{rpc_name} #{arg.join(', ')}"
      eval "old_#{rpc_class.downcase}_#{rpc_name} *arg"
     end 

     #注冊RPC調(diào)用
     rpc "#{rpc_class.downcase}.#{rpc_name}" => "#{rpc_class.downcase}_#{rpc_name}".to_sym

     #添加到全局變量,匯總所有的rpc方法
     @@rpc_list  "#{rpc_class.downcase}.#{rpc_name}"
    end
   end
   
   def help
    rpc_methods = (['help'] + @@rpc_list.sort).join("\n")
   end
   rpc "help" => :help

  end
 end #RPC

完成上述功能后,可以非常方便的開發(fā)rpc接口,例如下面這個IP地址增、刪、查的代碼,注冊ip.list, ip.add和ip.del方法:

module RPC
  module Ip
   #RPC_LIST used for regsiter rpc_call
   RPC_LIST = %w(list add del)

   def list
    $white_lists
   end   

   def add(ip) 
    if ip =~ /^((25[0-5]|2[0-4]\d|[0-1]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[0-1]?\d\d?)$/
     $white_lists  ip
     write_to_file
     return "succ"
    else
     return "fail"
    end
   end

   def del(ip)
    if $white_lists.include?(ip)
     $white_lists.delete ip
     write_to_file
     return "succ"
    else
     return "fail"
    end    
   end

   def write_to_file
     File.open(IP_yml, "w") do |f|
      $white_lists.uniq.each {|i| f  "- #{i}\n"}
     end
   end
  end 
 end

DSL——使用instance_eval

instance_eval是ruby語言中的瑞士軍刀,特別是支持DSL方面。
我們來看一下chef(一個開源的自動化部署工具)中設(shè)置文件模板的API:

復(fù)制代碼 代碼如下:

    template "/path/to/file.conf" do
      source "file.conf.erb"
      owner  "wilbur"
      mode   "0744"
    end

上述代碼中,source、owner、mode需要從外部block,傳遞到template內(nèi)部的block中,為了實(shí)現(xiàn)該目的,采用了instance_eval代碼如下:

  class ChefDSL
   def template(path, block)
    TemplateDSL.new(path, block)
   end
  end

  class TemplateDSL
   def initialize(path, block)
    @path = path
    instance_eval block
   end

   def source(source); @source = source; end
   def owner(owner);  @owner = owner; end
   def mode(mode);   @mode  = mode;  end
  end

上面這個小技巧使得TemplateDSL對象可以應(yīng)用block,和在自己的scope一樣。block可以訪問和調(diào)用TemplateDSL中的變量和方法。

如果沒有使用instance_eval,如下面的代碼,ruby就會拋出一個NoMethodError,因?yàn)閟ource、owner、mode無法在block中被訪問到。

復(fù)制代碼 代碼如下:

    class TemplateDSL
      def initialize(path, block)
        @path = path
        block.call
      end
    end

當(dāng)然也可以使用yeild傳遞變量的方式實(shí)現(xiàn),但沒有instance_eval簡潔和靈活。

命令行交互——使用instance_eval

命令行交互,可以采用highline這個gem.
但highline在有些方面不能滿足我的需求,比如類似上面介紹的chef template功能,達(dá)到的效果如下,大大簡化了重復(fù)代碼:

復(fù)制代碼 代碼如下:

        #檢查frigga fail,詢問是否繼續(xù)
        Tip.ask frigga_fail? do
          banner "Check some frigga failed, skip failed host and continue deploy?"
          on :yes
          on :quit do
            raise Odin::TipQuitExcption
          end
        end
        ...

        #運(yùn)行時顯示結(jié)果如下:
        Check some frigga failed, skip failed host and continue deploy? [yes/quit]
        #輸入yes繼續(xù),輸入quit退出

實(shí)現(xiàn)代碼如下:

 require 'colorize'
 class Tip
  def self.ask(stat = true, block)
   new(block).ret if stat == true
  end

  attr_reader :ret
  def initialize(block)
   @opt = []
   @caller = {}
   @banner = ""
   @ret = false
   self.instance_eval(block)
   print "#{@banner} [#{@opt.join('/')}]: ".light_yellow
   loop do
    x = gets.chomp.strip.to_sym
    if @opt.include?(x)
     @ret = ( @caller[x].call if @caller.key?(x) )
     if @ret == :retry
      print "\n#{@banner} [#{@opt.join('/')}]: ".light_yellow
      next
     else
      return @ret
     end
    else
     print "input error, please enter [#{@opt.join('/')}]: ".light_yellow
    end
   end

  end

  def on(opt, block)
   @opt  opt
   @caller[opt] = block if block_given?
  end
  def banner(str)
   @banner = str
  end
 end
您可能感興趣的文章:
  • Ruby元編程的一些值得注意的地方
  • ruby元編程之創(chuàng)建自己的動態(tài)方法
  • ruby元編程之method_missing的一個使用細(xì)節(jié)
  • Ruby元編程之夢中情人method_missing方法詳解
  • Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques)
  • Ruby元編程小結(jié)
  • Ruby和元編程之萬物皆為對象
  • Ruby元編程基礎(chǔ)學(xué)習(xí)筆記整理

標(biāo)簽:大慶 克拉瑪依 河池 西雙版納 南昌 甘孜 內(nèi)江 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ruby元編程實(shí)際使用實(shí)例》,本文關(guān)鍵詞  ruby,元,編程,實(shí)際,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ruby元編程實(shí)際使用實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于ruby元編程實(shí)際使用實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    在线国产电影不卡| 欧美一二区视频| 91精品国产aⅴ一区二区| 欧美午夜精品一区二区三区| 日本视频中文字幕一区二区三区| 一区二区免费看| 伊人一区二区三区| 亚洲激情校园春色| 免费高清不卡av| 成人免费看视频| 国产精品乱码一区二区三区软件 | 久久亚洲精精品中文字幕早川悠里| 精品国产乱码久久久久久夜甘婷婷 | 日韩成人免费看| 日韩国产欧美在线播放| 国产91高潮流白浆在线麻豆| 久久国产精品色婷婷| www.av精品| 欧美日韩另类国产亚洲欧美一级| 精品国产91乱码一区二区三区| 欧美韩国日本不卡| 国产精品视频免费| 日韩精品久久久久久| 国产呦萝稀缺另类资源| 欧美日韩在线电影| 久久精品男人的天堂| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久超碰97人人做人人爱| 一本一道波多野结衣一区二区| 777久久久精品| 国产精品白丝jk白祙喷水网站 | 欧美日韩综合不卡| 亚洲国产精品t66y| 亚洲制服欧美中文字幕中文字幕| 国产成人8x视频一区二区 | 日韩美女啊v在线免费观看| 亚洲国产一区视频| 免费在线观看成人| 91免费在线看| 欧美视频一区二区三区四区| 麻豆成人综合网| 欧美视频三区在线播放| 国产成人精品网址| 91在线观看污| 亚洲综合色噜噜狠狠| 一本到不卡免费一区二区| 日日夜夜免费精品视频| 4438x成人网最大色成网站| 成人看片黄a免费看在线| 日韩美女视频一区二区| 亚洲精品成人在线| 久久激情综合网| 91日韩在线专区| 亚洲精品一线二线三线无人区| 一个色在线综合| 成人精品在线视频观看| 日韩精品一区二区三区蜜臀 | 国产精品网站在线播放| 免费av成人在线| 欧美日韩中文精品| 日韩毛片精品高清免费| 成人一区二区视频| 精品国产一区二区三区av性色| 亚洲一区二区三区四区中文字幕| 暴力调教一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w | 亚洲成人av电影在线| 91丨porny丨国产| 久久久蜜桃精品| 国产一区999| 日韩精品一区二区三区视频在线观看| 亚洲va在线va天堂| 欧美精选在线播放| 午夜婷婷国产麻豆精品| eeuss鲁片一区二区三区在线看| 久久久国产综合精品女国产盗摄| 美女脱光内衣内裤视频久久网站 | 麻豆高清免费国产一区| 日本伊人色综合网| 欧美美女喷水视频| 亚洲国产一区二区在线播放| 在线视频你懂得一区二区三区| 中文字幕亚洲不卡| 97se亚洲国产综合自在线| 国产精品国产自产拍高清av王其| 精品国产亚洲一区二区三区在线观看| 欧美在线视频全部完| 日韩女同互慰一区二区| 99免费精品视频| 久久精品国产一区二区| 爽好久久久欧美精品| 激情综合网天天干| 久久99精品久久久久久国产越南 | 国产欧美在线观看一区| 日本强好片久久久久久aaa| 精品国产一区二区三区久久影院| 激情综合五月天| 亚洲视频在线一区二区| 在线免费观看日本欧美| 中文字幕成人在线观看| 国产乱子轮精品视频| 国产成人av电影| 欧美久久一二区| 欧美精品视频www在线观看| 国产视频一区在线播放| 国产成人精品免费一区二区| 国产欧美日韩精品一区| 91丨porny丨最新| 美女在线一区二区| 国产日韩三级在线| 日韩一区二区三区免费观看| 国产精品一二三区| 蜜臀av性久久久久蜜臀av麻豆| 国产拍欧美日韩视频二区| 91精品国产乱码| 国产高清不卡二三区| 婷婷综合久久一区二区三区| 欧美性猛交xxxxxxxx| 中文字幕亚洲区| 亚洲午夜激情网页| 国产精品精品国产色婷婷| 欧美视频在线不卡| 老色鬼精品视频在线观看播放| 亚洲精品免费电影| 日韩欧美国产不卡| 久久精品国产免费| 一区二区三区在线视频观看| 精品国产三级电影在线观看| 欧美色手机在线观看| 成人免费视频视频| 国产精品99久久久久久宅男| 亚瑟在线精品视频| 欧美亚一区二区| 国产91精品在线观看| 亚洲男人电影天堂| 日韩欧美电影一区| 日韩精品久久久久久| 亚洲综合色噜噜狠狠| 精品国产乱码久久久久久浪潮| 亚洲精品日韩综合观看成人91| 色婷婷国产精品| 一区二区三区中文在线| 在线观看成人免费视频| 日韩va亚洲va欧美va久久| 91精品国产综合久久久久久久久久 | 视频一区中文字幕| 久久久久久久久久美女| 4hu四虎永久在线影院成人| 91丨porny丨中文| 精品一区二区免费看| 日韩影院免费视频| 亚洲人亚洲人成电影网站色| 久久精品视频在线免费观看| 欧美一区二区视频网站| 欧美体内she精视频| 91在线视频播放| 成人精品小蝌蚪| 国产91丝袜在线观看| 国产精品亚洲专一区二区三区| 蜜桃视频在线观看一区二区| 一区二区高清免费观看影视大全 | 国产乱码精品一区二区三区av | 久久精品亚洲精品国产欧美| 精品日韩在线一区| 日韩欧美一区二区久久婷婷| 欧美一区二区三区视频免费| 欧美一区二区三区小说| 91麻豆精品国产综合久久久久久| 成人激情电影免费在线观看| 粉嫩av一区二区三区在线播放| 国产精选一区二区三区| 国产自产v一区二区三区c| 韩国中文字幕2020精品| 国产精品一区二区男女羞羞无遮挡 | 欧美大黄免费观看| 欧美精品日韩一区| 一区二区在线看| 国产精品久久久久久户外露出 | 美女尤物国产一区| 国产精品1区2区| 免费成人结看片| 国产成人日日夜夜| 日本成人中文字幕| 日韩av电影免费观看高清完整版 | 丁香五精品蜜臀久久久久99网站 | 粉嫩嫩av羞羞动漫久久久| 91视频.com| 日本va欧美va精品发布| 成人亚洲一区二区一| 91视视频在线观看入口直接观看www | 国产午夜精品在线观看| 中文字幕欧美三区| 日韩高清不卡在线| 国产一区视频在线看| 日本精品一区二区三区高清| 91精品久久久久久久久99蜜臂| 欧美www视频| 亚洲超丰满肉感bbw| 理论电影国产精品| 欧美日韩一区二区三区免费看|