[#39863] forループの速度 — Masahiro Sato <msato@...>

15 messages 2004/07/20

[#39868] イテレータとfor文 — OOTANI TAKASHI <otn@...5.so-net.ne.jp>

大谷と申します。

31 messages 2004/07/20
[#39886] Re: イテレータとfor文 — Tietew <tietew-ml-ruby-list@...> 2004/07/21

[ruby-list:39811] keyword-argument-like argument passing via Hash

From: NISHIMATSU Takeshi <t-nissie@...>
Date: 2004-07-02 11:20:27 UTC
List: ruby-list #39811
西松と申します.

Austin Zieglerさん の テキスト整形ツール Text::Format
<http://www.halostatue.ca/ruby/Text__Format.html> のソー
スを参考にnewの引数にHashやblockを使ってクラスの属性を設
定するようなスクリプト(下記 passhash.rb)を書いてみまし
た. しかし, Hashのキーのシンボルなどのtypo(綴り間違い)
を検出して例外を揚げるうまい方法が思い浮かびません. 実際,
Text::Formatもシンボルを綴り間違って, うまく設定ができて
いないのに原因がつかめず悩みました. なにかうまい方法はあ
りますでしょうか.

また, スクリプト全体についても「こう書いた方がよい」など
アドバイスがありましたらご教示いただければさいわいです.
よろしくお願いします.

スクリプト:
#!/usr/bin/env ruby
#passhash.rb
class K
public
  def initialize(arg=nil, &block)
    case arg
    when K
      @attrib1 = arg.attrib1
      @attrib2 = arg.attrib2
      @attrib3 = arg.attrib3
      instance_eval(&block) unless block.nil?
    when Hash
      __create do
        @attrib1 = arg[:attrib1] || arg['attrib1'] || @attrib1
        @attrib2 = arg[:attrib2] || arg['attrib2'] || @attrib2
        @attrib3 = arg[:attrib3] || arg['attrib3'] || @attrib3
        instance_eval(&block) unless block.nil?
      end
    when NilClass
      __create(&block)
    else
      raise TypeError
    end
  end

  def to_s
    return "#{@attrib1}, #{@attrib2}, #{@attrib3}\n"
  end

  attr_reader :attrib1, :attrib2, :attrib3

private
  def __create(&block)
    @attrib1='default1'
    @attrib2='default2'
    @attrib3='default3'
    instance_eval(&block) unless block.nil?
  end
end

k0 = K.new
print "k0 #{k0}"

k1 = K.new(:attrib1=>'aaaaaaaa', :attrib2=>'bbbbbbbb')
print "k1 #{k1}"   #引数はHash

k2 = K.new(:attrib1=>'11111111', 'attrib2'=>'22222222'){@attrib3='33333333'}
print "k2 #{k2}"   #引数のHashのキーはシンボルでもよいしStringでもよい.
                   #ブロックも使える.
k3 = K.new(k2){@attrib3='XXXXXXXX'}
print "k3 #{k3}"   #引数はK. ブロックを使って一部を変更できる.

k4 = K.new(:attlib1=>'HHHHHHHH', 'attlib2'=>'KKKKKKKK'){@attlib3='LLLLLLLL'}
print "k4 #{k4}"   #typo (att*l*ib1など) に無防備

実行例:
% ruby passhash.rb
k0 default1, default2, default3
k1 aaaaaaaa, bbbbbbbb, default3
k2 11111111, 22222222, 33333333
k3 11111111, 22222222, XXXXXXXX
k4 default1, default2, default3

-- 
 love && peace && free_software
 西松 毅




In This Thread

Prev Next