2017-09-05 6 views
-3

私はsortKeywordという文字列を持っています。私はオブジェクトの配列をその属性で並べ替えるが、並べ替える属性はsortKeywordに依存する。キーワード文字列に基づいてオブジェクトの属性別にRubyソート

例:sortKeywordは「名前」であるとき、私は

... sortKeywordは 『時代』であるとき、私はなど、オブジェクトの年齢属性にソートしたい、オブジェクト 『名前』属性でソートしたいですsortKeywordには10個の可能な値がありますので、当然のことながら、10個のswitch文を持っていません。 Rubyでこれを行うより良い方法はありますか?

+1

変数名には 'snake_case'を使用してください。 – Stefan

+1

"属性"とはどういう意味ですか?インスタンス変数 '@ foo'、メソッド' foo'、または 'attr_reader:foo'で定義したゲッターを意味しますか? – Max

+1

'attr_reader'で定義したインスタンス変数で、' keyword'が文字列の場合は – OMGitzMidgar

答えて

4

てみ使用public_send方法

array.sort_by { |item| item.public_send(sort_keyword) } 

https://ruby-doc.org/core-2.4.1/Object.html#method-i-public_send

+1

'.sort_by(&keyword)'や '.sort_by(&keyword.to_sym)'にアクセスできます。 – Ilya

+1

いずれの場合も、キーワードが許可されたオプションのみを含むようにフィルタリングされていることを確認してください。ユーザー入力が任意のメソッドを呼び出すことは望ましくありません。 – DGM

+1

これは、インスタンス変数にゲッターがあることを前提としています。 –

1

attributesゲッターを経由して、オブジェクトの属性を取得する可能性があります。普通の古き良きルビーでは、@Ursusの答えを参照してください。

array.sort_by { |e| e.attributes[SORTER] } 
+3

'属性'?これはRailsの質問ではないようです。 – Stefan

+0

@Stefanああ、私の悪い、私はあまりにも、ここでのほとんどすべての質問が[タグ:ruby-on-rails]であるという事実に没頭しているようだ。コメントします。 – mudasobwa

+1

'attributes'は、各呼び出しで新しいハッシュを返すので、かなり高価な関数になる可能性があります。積極的に呼び出されたときに非効率的になるものです。 – tadman

1
def sort_em(arr, attr) 
    arr.sort_by { |e| e.instance_variable_get "@#{attr}" } 
end 

のは、それを試してみましょう。

class Pets 
    def initialize(x,y,z) 
    @dog = x 
    @cat = y 
    @pig = z 
    end 
end 

a = Pets.new(1, 3, 2) 
    #=> #<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2> 
b = Pets.new(2, 1, 3) 
    #=> #<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3> 
c = Pets.new(3, 2, 1) 
    #=> #<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1> 
arr = [a, b, c] 

sort_em(arr, "dog") 
    #=> [#<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>, 
    # #<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>, 
    # #<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>] 
sort_em(arr, "cat") 
    #=> [#<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>, 
    # #<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>, 
    # #<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>] 
sort_em(arr, "pig") 
    #=> [#<Pets:0x00000001bd61a8 @dog=3, @cat=2, @pig=1>, 
    # #<Pets:0x00000001be8560 @dog=1, @cat=3, @pig=2>, 
    # #<Pets:0x00000001bdec68 @dog=2, @cat=1, @pig=3>] 
関連する問題