たけ(tk)です。

[ruby-list:33861] Re: xxとして出し入れするメソッドの名前は? にて 
"kumaryu" <kumaryu / kumaryu.net> さん 曰く:
》はじめまして、kumaryuと申します。

 こんにちは。レスありがとうございます。

》確かにVCLのStringsにはそんな機能がありますね。
	・・・
》私はVCLのStringsのその機能は簡易的なHashの代用か、Iniファイルのサポートのための機能と考えています。

 その通りです。

》Stringsを使うにしても、VCLのStringsよりRubyのHash、Array、Stringの方が柔軟な操作ができるのでStringsではtextの取得設定ができればだいたい何とかなりませんか?hがHashだとして、
》
》(h.to_a.correct {|arr| arr.join('=') }).join("\n")
》
》とすれば、適切な文字列が出来上がります(たぶん^^;)。これを設定できれば設定は特に問題ないと思います。Arrayの場合もほぼ同様ですね。設定というのが内容を置き換えるのではなくマージするものなら、Strings#to_hashなどでいったんHashにして、Hash#updateなどでマージしてから設定するのが普通でしょう。

  Strings#as_hash でいったんHashにして、Hash#updateなどでマージしてから、
Strings#as_hash= で設定する、というふうに考えていたわけです。

 実装自体はたいしたことなくて、実際には String#text で出し入れすること
になります。kumaryu さんのコードでOKでした。

module Phi
  class Strings
    def as_hash=(hash)
      self.text = hash.to_a.collect{|arr| arr.join('=') }.join("\n")
      return hash
    end
    def as_hash  # [ "key1=val1" , "key2=val2" , ... ]
      ret = {}
      self.each{|s|
        if /^(.*)=(.*)$/ =~ s
          ret[$1] = $2
        end
      }
      return ret
    end
    alias to_hash as_hash
  end
end

#### テストコード ・・ 全体は [ap-list:2531] 

hash = DEFAULT_PARAMS_FOR_INTERBASE.dup  ## ←これは省略
hash["Database"] = "C:\\Program Files\\Borland\\InterBase\\examples\\Database\\employee.gdb"
hash["Password"]  = "masterkey"
hash["User_Name"] = "sysdba"

connection = interbase_connection
connection.connection_name = "IBLocal_xx"
connection.login_prompt = false
connection.params.as_hash = hash	#	← Strings#as_hash=
p connection.params.as_hash		#	← Strings#as_hash
	#	{"Password"=>"masterkey", 
	#	"Database"=>"C:\\Program Files\\Borland\\InterBase\\examples\\Database\\employee.gdb",
	#	"SQLDialect"=>"1", 
	#		...
	#	"WaitOnLocks"=>"True",
	#	"User_Name"=>"sysdba"}

》しかし、Stringsの本来の機能から言えばそのような機能があることが不自然であるように思います。
	・・・
》本当にRubyらしいというならば、それをStringsの機能とせずに別なクラスとするほうが良いのではないでしょうか。
	・・・
》上のコードをいちいちやるのは面倒だと思うならば、新しくStringsのオブジェクトをHashやArrayから作れるようにするのがRubyらしいと思います。それでStringsからStringsを更新できるようにすればいいんじゃないかと。

 そういう方法もありますね。うーむ。それが Ruby らしい、かぁ・・。

 *  Strings#as_hash、Strings#as_hash= と比べるとやけに難しくなる気がす
るんだが・・。

》あとは変更をStringsに通知できるようなHashのサブクラスを作るとか。面倒ですね。

 こりゃ大変だ。Observer かな?。

》>   #array  : Array        #array=(array)>   #values : Hash         #values=(hash)>   #text   : String       #text=(string)
》
》valuesの戻り値をHashなどにしておくと、values['key'] = 'value'などが意図した通りに動きませんよね。ここはHashにするより普通にkeyを引数に取るattrにしたほうがいいと思います。

 values という名前はまずいですね。

 * もっとも、Ruby では「some_method[key]=」という形式のメソッドを作る
のは難しく、#[]= の方が簡単なので、Apolloでは Delphi の TStrings.values[] 
は Strings#[] にポートしてある。よってバッティングはしない。しかし、まぎ
らわしいことは確か。

 * うーむ。まだ、たけ(tk)の発想が Ruby 的でないと言うことか・・。

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武