[#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:39818] Re: keyword-argument-like argument passing via Hash

From: NISHIMATSU Takeshi <t-nissie@...>
Date: 2004-07-03 11:03:42 UTC
List: ruby-list #39818
西松です.

ささださま, アドバイスありがとうございます.

>>> [ruby-list:39812]
>  Hash のキーをチェックするなら,ハッシュのキーに変なもの
> を指定されてたら例外を発生させればいいのではないでしょうか.
       . . .
> 直接 instance_eval を
> 実行してしまうのは,ほかにも変なことやっちゃうかもしれないので,
> できれば避けた方がいいんじゃないかと思います.

なるほど. block引数やinstance_evalなどを使わないで
シンプルなほうがよいと思い直しました.

>>> [ruby-list:39813]
>  今後,これに代わる表現として K.new(key: val, ...) というも
> のになるそうです.

ぼくもキーワード引数
<http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Ruby2.0spec>
ができたら, Hashの引数がどうなってしまうかはよくわか
らないのですが, キーワード引数のほうが便利そうですし,
かんたんな書き換えで対応できるようにしておいたほうが
よいと思いました.

それで, いまのスクリプトは下記のようなかんじになって
います.

#!/usr/bin/env ruby
#defaulthash.rb
class K
  attr_reader :attribs
  def initialize(defaultK=nil, arg_hash=nil)
    case defaultK
    when K
      @attribs = defaultK.attribs.dup      # dup必要?
    when Hash, NilClass
      arg_hash = defaultK
      @attribs = {:attrib1 => 'default1',
                  :attrib2 => 'default2',
                  :attrib3 => 'default3'} # default values
    else
      raise TypeError
    end

    case arg_hash
    when Hash
      arg_hash.each do |key, value|
        if @attribs[key]
          @attribs[key]=value
        else
          raise ArgumentError, "こんなキーしりません: #{key}"
        end
      end
    when NilClass
      # use default
    else
      raise TypeError
    end
  end

  def to_s
    return "#{@attribs[:attrib1]}, #{@attribs[:attrib2]}, #{@attribs[:attrib3]}\n"
  end
end

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

k2 = K.new(:attrib1=>'11111111', :attrib2=>'22222222')
print "k2 #{k2}"

k4 = K.new(k2, :attrib2=>'XXXXXXXX', :attrib3=>'YYYYYYYY')
print "k4 #{k4}"   # 第一引数はK. 残りの引数でいくつか変更をする.
print "k2 #{k2}"   # 上のdupがないとk4といっしょに変わってしまう.

k5 = K.new({:attrib2=>'HHHHHHHH', :attrib3=>'KKKKKKKK'})
print "k5 #{k5}"   # {}があっても大丈夫. 将来的にこっちの方がよい?

k6 = K.new(:attlib1=>'LLLLLLLL')


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



In This Thread

Prev Next