Что лучший способ состоит в том, чтобы обработать константы в Ruby при использовании направляющих?

В духе оригинального вопроса:

Я бы хотел сравнить два массива ... идеально, эффективно.

blockquote>

Я выполнял тесты производительности на некоторые из более простых предложений, предложенных здесь, со следующими результатами (быстрый до медленного):

, а (67%) - Tim Down

var i = a1.length;
while (i--) {
    if (a1[i] !== a2[i]) return false;
}
return true

каждый (69 %) пользователем2782196

a1.every((v,i)=> v === a2[i]);

уменьшить (74%) с помощью DEI

a1.reduce((a, b) => a && a2.includes(b), true);

join & amp; toString (78%) Gaizka Allende & amp; vivek

a1.join('') === a2.join('');

a1.toString() === a2.toString();

half toString (90%) от Victor Palomo

a1 == a2.toString();

stringify (100%) на radtek

JSON.stringify(a1) === JSON.stringify(a2);

Обратите внимание, что приведенные ниже примеры предполагают, что массивы отсортированы, одномерные массивы. Сравнение .length было удалено для общего теста (добавьте a1.length === a2.length к любому из предложений, и вы получите повышение производительности на 10%). Выберите любые решения, которые лучше всего подходят для вас, зная скорость и ограничение каждого из них.

Несвязанное примечание: интересно видеть, как люди получают все триггер-счастливые Джон Уэйнс при снижении голосов на вполне законные ответы на этот вопрос.

blockquote>

43
задан John Topley 6 November 2008 в 02:42
поделиться

4 ответа

Можно использовать массив или хешировать с этой целью (в environment.rb):

OPTIONS = ['one', 'two', 'three']
OPTIONS = {:one => 1, :two => 2, :three => 3}

или альтернативно класс перечисления, который позволяет Вам перечислять по Вашим константам, а также ключам, раньше связывал их:

class Enumeration
  def Enumeration.add_item(key,value)
    @hash ||= {}
    @hash[key]=value
  end

  def Enumeration.const_missing(key)
    @hash[key]
  end   

  def Enumeration.each
    @hash.each {|key,value| yield(key,value)}
  end

  def Enumeration.values
    @hash.values || []
  end

  def Enumeration.keys
    @hash.keys || []
  end

  def Enumeration.[](key)
    @hash[key]
  end
end

, из которого можно тогда произойти:

class Values < Enumeration
  self.add_item(:RED, '#f00')
  self.add_item(:GREEN, '#0f0')
  self.add_item(:BLUE, '#00f')
end

и использование как это:

Values::RED    => '#f00'
Values::GREEN  => '#0f0'
Values::BLUE   => '#00f'

Values.keys    => [:RED, :GREEN, :BLUE]
Values.values  => ['#f00', '#0f0', '#00f']
40
ответ дан marcosdsanchez 23 September 2019 в 12:52
поделиться

Я поместил их непосредственно в образцовый класс, как так:

class MyClass < ActiveRecord::Base
  ACTIVE_STATUS = "active"
  INACTIVE_STATUS = "inactive"
  PENDING_STATUS = "pending"
end

Затем при использовании модели от другого класса, я ссылаюсь на константы

@model.status = MyClass::ACTIVE_STATUS
@model.save
11
ответ дан dusan 23 September 2019 в 12:52
поделиться

Если это управляет поведением модели, то константы должны быть частью модели:

class Model < ActiveRecord::Base
  ONE = 1
  TWO = 2

  validates_inclusion_of :value, :in => [ONE, TWO]
end

Это позволит Вам использовать встроенную функциональность направляющих:

>> m=Model.new
=> #<Model id: nil, value: nil, created_at: nil, updated_at: nil>
>> m.valid?
=> false
>> m.value = 1
=> 1
>> m.valid?
=> true

, С другой стороны, если Ваши перечисления поддержки БД, то можно использовать что-то как Перечислимый плагин Столбца .

9
ответ дан Dave 23 September 2019 в 12:52
поделиться

Можно также использовать его в рамках модели в хеше как это:


class MyModel

  SOME_ATTR_OPTIONS = {
    :first_option => 1,
    :second_option => 2, 
    :third_option => 3
  }
end

И использование это как это:



if x == MyModel::SOME_ATTR_OPTIONS[:first_option]
  do this
end

5
ответ дан Dema 23 September 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: