質問内容
クラスのコンストラクタで初期値を複数同時に設定したいです。
以下の例で示すと、new する時に service_name, account, password のうち
どれか一つを指定する場合、必ず他2つもセットで指定しないとエラーとなるようにしたいです。
ruby
1# 呼出側 2acc = accClass.new(key) # => OK 3acc = accClass.new(key, :service_name ) # => ERROR(引数エラー) 4acc = accClass.new(key, :service_name, :account ) # => ERROR(引数エラー) 5acc = accClass.new(key, :service_name, :account, :password ) # => OK
多少呼出の形は変わっても問題ありませんので、
どのようにしたら良いのでしょうか。
ご教授のほどよろしくお願いします。
PS. 後半の3つの引数をクラスに纏めてみましたが、うまくうごきませんでした。
ruby
1# accProperty 2class accProperty 3 def initialize(service_name: 'aws', account: 'user1', password: 'p1' ) 4 @service_name = service_name 5 @account = account 6 @password = password 7 end 8 attr_accessor: :service_name 9 attr_accessor: :account 10 attr_accessor: :password 11end 12 13# accClass 14class accClass 15 def initialize(key, prop = accProperty.new() ) 16 @key = key 17 @svc_name = prop.service_name 18 @acc = prop.account 19 @pass = prop.password 20 end 21end
環境
bash
1$ ruby -v 2ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
どの様になりたいのか、が良くわかりません。
1) 「以下の様な挙動になるようにしたい」の下にある44つのnewでコメントに OK,エラー,エラー、OK とありますが、
そうなるようにしたい のか そうなってしまうのでみなOKにしたいのか
どちらでしょう
2) keyには何が入り、それはnewされた時にどう扱われたいのでしょう
私もwinterboumさんと同じ疑問を抱きましたし、デフォルト引数じゃダメなのか?とも思いました。
winterboumさん、
1)前者です。
引数が1つor4つの場合のみ、処理を続けたくて、引数が2つor3つの時はわざと例外を発生させたいのです。
2)keyは必須の引数として扱いたい意図としているだけですので、今回の質問の本題からはほぼ無関係です。PS.の例からkeyが抜けていました。今後のために修正しておきます。
dodox86さん
デフォルト引数でservice_name,account,password を個別に指定すると、
service_name, account を使う側から指定してpasswordはデフォルトの値を使うといったことができるようになります。
service_name, account, password のどれか一つでもデフォルトから変更する場合、必ず他2つも指定が必須になるようにプログラムを記述したいのです。
わざわざコメントありがとうございます。
> 引数が1つor4つの場合のみ、処理を続けたくて、
この時点でデフォルト引数では要望を満たせないなと思いました。承知しました。
回答1件
あなたの回答
tips
プレビュー