Ruby min max операторы присваивания - PullRequest
3 голосов
/ 03 февраля 2012

При программировании ruby ​​я всегда обнаруживаю, что занимаюсь этим:

a = [a, b].min

Это означает сравнение a и b и сохранение наименьшего значения в a. Мне не нравится писать код выше, так как я должен написать a дважды.

Я знаю, что на некоторых нестандартных диалектах C ++ был оператор, который делал именно это

a <?= b

Что я считаю очень удобным. Но я не очень заинтересован в операторе так сильно, как в функции , позволяющей избежать повторения . Я также был бы счастлив, если бы я мог написать

a.keep_max(b)

a может быть довольно длинной переменной, например my_array[indice1][indice2], и вы не хотите писать это дважды.

Я много гуглил по этому вопросу и не нашел результата, надеюсь, этот вопрос всплывет и будет полезен другим.

Итак, есть ли какой-нибудь неповторяющийся способ выразить то, что я хочу, в рубине?

Ответы [ 5 ]

2 голосов
/ 03 февраля 2012

Я не понимаю вашего вопроса. Вы всегда можете сделать что-то подобное ...

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

Что ж, это не сработает для всех объектов с <=>, потому что не все из них реализуют Comparable, так что вы можете monkey-patch Object.

Лично я предпочитаю ясность и стараюсь избегать мартышек. Кроме того, это явно двоичный предикат , такой же, как «+», поэтому объединение методов не обязательно имеет смысл, поэтому я предпочитаю что-то подобное, чтобы избавиться от синтаксиса этого массива:

def min(*args)
   args.min
end

def max(*args)
   args.max
end

min(1, 2)
=> 1

max(1, 2)
=> 2

Но, эй, я тоже разработчик Python: -)

2 голосов
/ 03 февраля 2012

То, что вы хотели бы сделать, на самом деле невозможно в ruby ​​( см. Этот вопрос ). Я думаю, что лучшее, что вы можете сделать, это

def max(*args)
  args.max
end

a = max a, b
1 голос
/ 03 февраля 2012

Вы можете определить свой собственный метод для него:

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

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

Но вы должны быть осторожны при определении методов для объекта, поскольку он может иметь непредсказуемое поведение (например, если объекты нельзя сравнивать).

0 голосов
/ 09 октября 2014
    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 голосов
/ 04 февраля 2012
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

Это в основном то, что вы хотите. Взгляните на Изменение переменной, переданной в методе

...