バリケンのRuby日記 RSSフィード

2006-06-13

[] QuickMLソースコードを読む(6) /usr/lib/ruby/1.8/quickml/config.rb  QuickMLのソースコードを読む(6) /usr/lib/ruby/1.8/quickml/config.rb - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  QuickMLのソースコードを読む(6) /usr/lib/ruby/1.8/quickml/config.rb - バリケンのRuby日記  QuickMLのソースコードを読む(6) /usr/lib/ruby/1.8/quickml/config.rb - バリケンのRuby日記 のブックマークコメント

今日からは「QuickML::Configクラス」の定義が書かれている「/usr/lib/ruby/1.8/quickml/config.rb」のコードを読んでいくよ。

require

require 'quickml/utils'
require 'quickml/logger'
require 'quickml/gettext'

これは、Kernel#requireメソッドで「/usr/lib/ruby/1.8/quickml/utils.rb」「/usr/lib/ruby/1.8/quickml/logger.rb」「/usr/lib/ruby/1.8/quickml/gettext.rb」をrubyスクリプトとして読んでいるよ。

QuickML::Configクラスのinitialize

じゃあ、QuickML::Configクラスインスタンスが生成されるときに呼び出されるinitializeメソッドを見てみるよ。

    def initialize (config = {})
      @data_dir = config[:data_dir]
      @smtp_host = config[:smtp_host]
      @domain = config[:domain]

まず、引数デフォルトでは空のHashオブジェクト)にconfigというラベル(変数)を貼り付けているよ。

次に、config[:data_dir]とconfig[:smtp_host]とconfig[:domain]に、@data_dirと@smtp_hostと@domainというラベル(インスタンス変数)を貼り付けているよ。

      raise ArgumentError if @data_dir.nil?
      raise ArgumentError if @smtp_host.nil?
      raise ArgumentError if @domain.nil?

これはKernel#raiseによって、@data_dir、@smtp_host、@domainが貼られているオブジェクトnilであるなら、ArgumentError例外を発生させる、ということだよ。

      @smtp_port = (config[:smtp_port] or 25)
      @postmaster = (config[:postmaster] or "postmaster@#{domain}")
      @info_url = (config[:info_url] or "http://QuickML.com/")

      @pid_file = (config[:pid_file] or "/var/run/quickml.pid")
      @max_members = (config[:max_members] or 100)
      @max_mail_length = (config[:max_mail_length] or 100 * 1024) # 100KB
      @max_ml_mail_length = @max_mail_length
      @ml_life_time = (config[:ml_life_time] or 86400 * 30)
      @ml_alert_time = (config[:ml_alert_time] or 86400 * 29)
      @sweep_interval = (config[:sweep_interval] or 3600)
      @allowable_error_interval = (config[:allowable_error_interval] or 8600)
      @max_threads = (config[:max_threads] or 10) # number of working threads
      @timeout = (config[:timeout] or 120)
      @auto_unsubscribe_count = (config[:auto_unsubscribe_count] or 5)

      @log_file = (config[:log_file] or "/var/log/quickml-log")
      verbose_mode = config[:verbose_mode]

このへんは見たまんまだから、説明いらないよね?

      @logger = Logger.new(@log_file, verbose_mode)
      @ml_mutexes = Hash.new
      @catalog = if config[:message_catalog]
                   GetText::Catalog.new(config[:message_catalog])
                 else
                   nil
                 end

おや、QuickML::LoggerクラスインスタンスQuickML::GetText::Catalogクラスインスタンスを生成しているね。QuickML::Loggerクラスの定義は/usr/lib/ruby/1.8/quickml/logger.rbで、QuickML::GetText::Catalogクラスの定義は/usr/lib/ruby/1.8/quickml/gettext.rbでされているよ。そっちを見るのはまた今度にしよう。

      @port = (config[:port] or 25)
      @bind_address = (config[:bind_address] or "0.0.0.0")
      @user = (config[:user] or "root")
      @group = (config[:group] or "root")
      @use_qmail_verp = (config[:use_qmail_verp] or false)

      @authorized_creators_list = config[:authorized_creators_list]
      @distribute_address = config[:distribute_address]
      @report_address = config[:report_address]

      charset = @catalog.charset if @catalog
      @content_type = "text/plain"

      @confirm_ml_creation = (config[:confirm_ml_creation] or false)

このへんも説明いらないよねえ。見たまんまだし。

      instance_variables.each {|name|
        self.class.class_eval { attr_reader name.delete('@') }
      }
    end

ん、最後で面白いことをしているね。Object#instance_variablesメソッドは、オブジェクトインスタンス変数名を文字列の配列として返すよ。

そして、Module#class_evalメソッドで、各インスタンス変数名から「@」を取ったものをModule#attr_readerによってアクセサ定義しているよ。すべてのインスタンス変数にアクセサを設定したいときに便利だね。

とりあえず今日はここまで。