質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

4回答

2555閲覧

Rubyで同じ条件のcase文を利用するが、返り値を変えたい場合の処理。

rubyman

総合スコア8

Ruby

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

0グッド

0クリップ

投稿2016/02/15 14:17

同じ条件のcase文を使い、2通りの返り値が欲しい時の処理の実装に悩んでいます。
以下はあくまで例えで、複数のメソッドで同じcase文の条件を使用している場合の共通化の方法が知りたいです。

ruby

1def name 2 case animal.type 3 when :lion 4 "ライオン" 5 when :tiger 6 "虎" 7 when :bird 8 "鳥" 9 end 10end 11 12def site 13 case animal.type 14 when :lion 15 "http://lion.com" 16 when :tiger 17 "http://tiger.com" 18 when :bird 19 "http://bird.com" 20 end 21end

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

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

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

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

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

guest

回答4

0

いろいろな改善策があると思いますが、構造がみえないので、アドバイスしづらいです。
animalというのは何ですか?ローカル変数?同じクラスのメソッド?関数的メソッド?

クラス全体を書いてもらうといいかと思います。

追記:
やはり、やりたいことをちゃんと書いてもらわないと、ニーズに合うかどうか分からない回答しかできないです。

複数のメソッドで同じcase文の条件を使用している場合

ということが必要となった時点で、設計に失敗している可能性もありますし。

投稿2016/02/16 14:00

編集2016/02/17 01:48
otn

総合スコア84499

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

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

退会済みユーザー

退会済みユーザー

2016/02/16 15:10

あくまで例えって言ってるかと思います
guest

0

下記のように書くとさらに簡潔ですよ
Rubyでは変数の代入時に変数名を「,」で区切ることで
配列を展開して代入することができます。

def animals(type) case type when :lion ["ライオン", "http://lion.com"] when :tiger ["虎", "http://tiger.com"] when :bird ["鳥", "http://bird.com"] end end
animal, site = animals(type) p animl p site

投稿2016/02/15 14:50

編集2016/02/15 14:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

case での分岐をするのではなく,ハッシュを引くかたちにしてはどうでしょう?

ruby

1ANIMALS = { 2 lion: {name: 'ライオン', site: 'http://lion.com'}, 3 tiger: {name: '虎', site: 'http://tiger.com'}, 4 bird: {name: '鳥', site: 'http://bird.com'}, 5} 6 7def name(kind) 8 ANIMALS[kind][:name] 9end 10 11def site(kind) 12 ANIMALS[kind][:site] 13end 14 15p name(:lion) 16p site(:lion)

実行結果:

$ ruby a.rb "ライオン" "http://lion.com"

投稿2016/02/15 21:35

katoy

総合スコア22324

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

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

0

def animals(type) case type when :lion {:name => "ライオン", :site => "http://lion.com"} when :tiger {:name => "虎", :site => "http://tiger.com"} when :bird {:name => "鳥", :site => "http://bird.com"} end end result = animals(animal.type) p result[:name], result[:site]

属性を問い合わせしているような形にしてみました。いっそ,Animalクラスに組み込んでしまっても良いかもしれません。

投稿2016/02/15 14:32

NCC1701

総合スコア1680

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

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

rubyman

2016/02/15 14:34

回答ありがとうございます! このような処理にする場合、ハッシュのkeyを何度も同じものを書くことになると思うのですが、それはしょうがないという感じなのでしょうか?
NCC1701

2016/02/15 14:55

どのように設計するかによるでしょう。たとえば ["ライオン", "http://lion.com"]のように配列を返り値にして,result[0], result[1]とすれば,keyの繰り返しを避けることができる反面,コードは読みにくくなります。 それにデータが多くなった場合,動物の種類が増えるだけでなく属性(たとえば,体長,分布など)が増えれば,csv(table)データやactive_recordといった別の形式をとった方が良い場合もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問