Ruby min max赋值运算符

时间:2012-02-03 13:17:00

标签: ruby variable-assignment max assignment-operator min

编程ruby时,我总是发现自己这样做:

a = [a, b].min

这意味着比较ab并将最小值存储在a中。我不喜欢编写上面的代码,因为我必须写两次a

我知道C ++的一些非标准方言有一个完全符合这个要求的运算符

a <?= b

我觉得很方便。但我对运算符并不感兴趣,就像我在避免重复的功能一样。如果我能写的话,我也会很高兴

a.keep_max(b)

a可以是一个很长的变量,例如my_array[indice1][indice2],你不想写两次。

我做了很多谷歌搜索并发现没有结果,希望这个问题会弹出并对其他人有用。

那么,是否有任何非重复的方式来表达我想要的红宝石?

5 个答案:

答案 0 :(得分:2)

我不明白你的问题。你可以随时做这样的事情......

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

嗯,这对于&lt; =&gt;的所有对象都不起作用因为并非所有这些都实现了Comparable,所以你可以修补对象。

就我个人而言,我更喜欢清晰,并且倾向于避免猴子修补。另外,这显然是一个二元谓词,就像“+”一样,因此方法链不一定有意义,所以我更喜欢这样的东西去除那个数组语法:

def min(*args)
   args.min
end

def max(*args)
   args.max
end

min(1, 2)
=> 1

max(1, 2)
=> 2

但是,嘿,我也是一名Python开发人员: - )

答案 1 :(得分:2)

你想要做的事实上不可能在ruby(see this question)中。我认为你能做的最好的就是

def max(*args)
  args.max
end

a = max a, b

答案 2 :(得分:1)

您可以为它定义自己的方法:

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

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

但是你应该小心定义Object上的方法,因为它可能有不可预测的行为(例如,如果无法比较对象)。

答案 3 :(得分: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

答案 4 :(得分:-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}"