Я изучал, как возиться с специальными механизмами сортировки в Ruby. Я в конечном итоге переписывания this neat JavaScript solution в Ruby:Возможно ли переопределить встроенный метод Ruby вне класса или модуля?
class SpecialStr
include Comparable
attr_accessor :str
def initialize (str)
@str = str
end
def <=> (other)
self_num, self_string = @str.split(' ')
other_num, other_string = other.str.split(' ')
self_num > other_num ? 1 : other_num > self_num ? -1 :
self_string > other_string ? -1 : 1
end
end
arr = ['2 xxx', '20 axxx', '2 m', '38 xxxx', '20 bx', '8540 xxxxxx', '2 z']
arr_object = []
arr.each { |str| arr_object << SpecialStr.new(str) }
arr_object.sort! { |x, y| y <=> x }
output_arr = []
arr_object.each { |obj| output_arr << obj.str}
puts output_arr
Это желаемый выход (номер по убыванию, то строки по возрастанию):
8540 xxxxxx
38 xxxx
20 axxx
20 bx
2 m
2 xxx
2 z
Но код казалось излишне сложным. (Руби должен быть более кратким, чем JS!) Поэтому я спросил себя (и теперь я спрашиваю вас), почему я не могу это сделать?
def <=> (other)
self_num, self_string = self.split(' ')
other_num, other_string = other.split(' ')
self_num > other_num ? 1 : other_num > self_num ? -1 :
self_string > other_string ? -1 : 1
end
arr = ['2 xxx', '20 axxx', '2 m', '38 xxxx', '20 bx', '8540 xxxxxx', '2 z']
arr.sort! { |x, y| y <=> x }
puts arr
Это выводит неправильно, основываясь на sort
, как если бы я не переопределяется <=>
:
8540 xxxxxx
38 xxxx
20 bx
20 axxx
2 z
2 xxx
2 m
код здесь короче, но не работает. Он использует версию <=>
, встроенную в модуль Ruby's Comparable
, а не мою попытку переопределить его. Почему я не смог его переопределить? Могут ли методы быть переопределены только внутри классов или модулей? Есть ли там более короткий способ написать этот первый скрипт в Ruby? (Извините, если это нуб вопрос, я новичок.)
Святое дерьмо! Это намного проще, чем что-либо, что я или другие люди на этой более ранней теме! Отлично сработано. Не отвечает на вопрос, но полностью решает исходную проблему! – globewalldesk