编程ruby时,我总是发现自己这样做:
a = [a, b].min
这意味着比较a
和b
并将最小值存储在a
中。我不喜欢编写上面的代码,因为我必须写两次a
。
我知道C ++的一些非标准方言有一个完全符合这个要求的运算符
a <?= b
我觉得很方便。但我对运算符并不感兴趣,就像我在避免重复的功能一样。如果我能写的话,我也会很高兴
a.keep_max(b)
a
可以是一个很长的变量,例如my_array[indice1][indice2]
,你不想写两次。
我做了很多谷歌搜索并发现没有结果,希望这个问题会弹出并对其他人有用。
那么,是否有任何非重复的方式来表达我想要的红宝石?
答案 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}"