2012-02-03 9 views
3

私は常に自分自身がこれをやって見つけるルビーをプログラミングする場合:ルビー分最大代入演算子

a = [a, b].min 

これはabを比較し、aの中で最も小さい値を格納意味。私はaを2度書く必要があるので、上記のコードを書くのが好きではありません。

私はC++のいくつかの非標準的な方言は、私は非常に便利見つけるまさにこの

a <?= b 

をした事業者があったことを知っています。しかし、私は実際に私がの反復を避けるという特徴にあるほど、オペレータにはあまり興味がありません。私は

a.keep_max(b) 

amy_array[indice1][indice2]のような非常に長い変数、することができ、あなたはその倍を書きたくない書くことができれば、私も幸せになります。

私はこれでグーグルでやったことがありませんでしたし、結果が見つかりませんでした、うまくいけば、この質問がポップアップし、他の人にも便利です。

ですから、私がルビーで望むものを表現するための反復的な方法はありませんか?

+1

IMO再結合値を見てみましょう。それについて考えてみましょう:今は 'a'は値2、もう一つは魔法、' a'は値1を持っています...その種のコードは理解してデバッグするのが難しいです。しかし、もちろん、私は機能的な醜い人です;-) – tokland

+0

@tokland、そうですね。しかし、典型的な動的プログラミングコード、例えばfloyd-warshallについては、私が表現したものを正確に行うことがよくあります。結局のところ、割り当ては命令的言語の力となり得る。 – Tarrasch

+1

あなたが命令的なループの中にいるときは、変数名を再利用する以外に選択肢がありません(そして、そのアルゴリズムの機能的実装はRubyでは非効率かもしれません)。私の注釈は、ちょうど理由があるために変数名を再利用する、怠惰なコーディングに対する防御に過ぎませんでした。 – tokland

答えて

2

あなたがしたいことは、実際にはルビー(see this question)では不可能です。私はあなたができる最善の

def max(*args) 
    args.max 
end 

a = max a, b 
+0

正解は確かに 'eval'トリックなしでは単純にできないように思えます(もう一つの質問はthanks @ kentorです)。 – Tarrasch

+0

それでは 'a + = 1'はなぜ機能するのですか? – Chloe

1

あなたはそれのために独自のメソッドを定義することができます

class Object 
    def keep_max(other) 
    [self, other].max 
    end 
end 

a = 3 
b = 7 
puts a.keep_max(b) 

をしかし、(オブジェクトは比較できない場合、たとえば)、それは予期しない動作を持つことができるよう、あなたは、オブジェクトのメソッドを定義するように注意する必要があります。

2

私はあなたの質問を理解していません。あなたはいつも... < =>それらのすべてがComparableを実装しているためではなく、あなたができるようモンキーパッチオブジェクトを持つすべてのオブジェクトのために動作しません

module Comparable 
    def keep_min(other) 
    (self <=> other) <= 0 ? self : other 
    end 

    def keep_max(other) 
    (self <=> other) >= 0 ? self : other 
    end 
end 

1.keep_min(2) 
=> 1 

1.keep_max(2) 
=> 2 

まあが、このような何かを行うことができます。

私は個人的には明確で、サルのパッチを避ける傾向があります。プラス、これは明らかにそのための方法-チェーンは必ずしもそう私はその配列の構文を取り除くために、このようなものを好む意味がありません、ただ「+」のように、バイナリ述語です:

def min(*args) 
    args.min 
end 

def max(*args) 
    args.max 
end 

min(1, 2) 
=> 1 

max(1, 2) 
=> 2 

でもねえ私もPythonの開発者です:-)

0
def keep_max(var, other, binding) 
    eval "#{var} = [#{var}, #{other}].max", binding 
end 

a = 5 
b = 78 
keep_max(:a, :b, binding) 
puts a 
#=> 78 

これは、基本的に何をしたいんだと思います。ちょうど別の名前で新しい変数を作成し、悪い選択である(それを行うための優れた理由なし)Change variable passed in a method

+0

'eval'と' keep_max'のための 'binding'は、それをすることをお勧めしません。 – Dorian

-1
arr = {2,4,3,6} 
    min = arr[0]; 
    max = arr[0]; 
    arr1[0]=arr[1]; 
    arr1[1]=arr[2]; 
    arr1[2]=arr[3]; 
    arr1.each() { |val| 
     if min>val 
     min=val; 
    end 
    } 
    arr1.each() { |val| 
     if max<val 
     max=val 
    end 
    } 
    puts "The minimum value is #{min}" 
    puts "The maximum value is #{max}" 
+0

Hey Harsha :) Stack Overflowへようこそ!単にあなたに知らせるために、私たちは、通常、答えにコードを掲載するのではなく、アドバイスします。あなたの答えがもたらすものに少しの文脈を追加するために編集できるなら、それは非常に高く評価されるでしょう:)。 Thx ^^ – Patrice