🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

774閲覧

Ruby のコンストラクタで初期値を同時に強制したい

kurokoSin

総合スコア133

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/10/08 15:43

編集2019/10/09 13:03

質問内容

クラスのコンストラクタで初期値を複数同時に設定したいです。
以下の例で示すと、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]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2019/10/08 23:25

どの様になりたいのか、が良くわかりません。 1) 「以下の様な挙動になるようにしたい」の下にある44つのnewでコメントに OK,エラー,エラー、OK とありますが、 そうなるようにしたい のか そうなってしまうのでみなOKにしたいのか どちらでしょう 2) keyには何が入り、それはnewされた時にどう扱われたいのでしょう
dodox86

2019/10/09 00:01

私もwinterboumさんと同じ疑問を抱きましたし、デフォルト引数じゃダメなのか?とも思いました。
kurokoSin

2019/10/09 12:50 編集

winterboumさん、 1)前者です。 引数が1つor4つの場合のみ、処理を続けたくて、引数が2つor3つの時はわざと例外を発生させたいのです。 2)keyは必須の引数として扱いたい意図としているだけですので、今回の質問の本題からはほぼ無関係です。PS.の例からkeyが抜けていました。今後のために修正しておきます。
kurokoSin

2019/10/09 12:55

dodox86さん デフォルト引数でservice_name,account,password を個別に指定すると、 service_name, account を使う側から指定してpasswordはデフォルトの値を使うといったことができるようになります。 service_name, account, password のどれか一つでもデフォルトから変更する場合、必ず他2つも指定が必須になるようにプログラムを記述したいのです。
dodox86

2019/10/09 13:03

わざわざコメントありがとうございます。 > 引数が1つor4つの場合のみ、処理を続けたくて、 この時点でデフォルト引数では要望を満たせないなと思いました。承知しました。
guest

回答1

0

ベストアンサー

ruby

1class Acc 2 def initialize(key, *args) 3 args = %w[aws user1 p1] if args.empty? 4 raise ArgumentError.new("wrong number of arguments (given #{args.size+1}, expected 1 or 4)") unless args.size == 3 5 @svc_name, @acc, @pass = args 6 @key = key 7 end 8end 9 10p Acc.new("key") 11p Acc.new("key", "a", "b", "c") 12p Acc.new("key", "a") rescue p $! 13p Acc.new("key", "a", "b") rescue p $! 14p Acc.new("key", "a", "b", "c", "d") rescue p $!

投稿2019/10/09 00:27

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurokoSin

2019/10/09 13:08

asmさん ありがとう御座います! 期待していたとおりの動きにできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問