За и против, явно устанавливающие значения перечислимого поля

Другое важное, но тонкое различие между procs, созданным с lambda и procs, созданным с Proc.new, - то, как они обрабатывают return оператор:

  • В lambda - создал proc, return, оператор возвращается только из самого proc
  • В Proc.new - создал proc, return, оператор немного более удивителен: это возвращает управление не только от proc, , но также и из метода, включающего proc!

Вот lambda - созданный proc's return в действии. Это ведет себя способом, что Вы, вероятно, ожидаете:

def whowouldwin

  mylambda = lambda {return "Freddy"}
  mylambda.call

  # mylambda gets called and returns "Freddy", and execution
  # continues on the next line

  return "Jason"

end


whowouldwin
#=> "Jason"

Теперь вот Proc.new - созданный proc's return выполнение того же самого. Вы собираетесь видеть один из тех случаев, где Ruby повреждает превозносимый Принцип Наименьшего количества Удивления:

def whowouldwin2

  myproc = Proc.new {return "Freddy"}
  myproc.call

  # myproc gets called and returns "Freddy", 
  # but also returns control from whowhouldwin2!
  # The line below *never* gets executed.

  return "Jason"

end


whowouldwin2         
#=> "Freddy"

Благодаря этому удивительному поведению (а также меньше ввода), я склонен одобрять использование lambda [более чем 1 114] при создании procs.

13
задан skaffman 11 December 2010 в 21:32
поделиться

9 ответов

Enum1 и Enum2 компилируются в одно и то же перечисление. Так что с точки зрения программирования разницы нет. С точки зрения обслуживания проблем может быть, а может и не быть.

С одной стороны, объявление явных значений абсолютно необходимо для перечисления [Flags] ; и они должны быть значениями в степени 2.

С другой стороны, явные значения могут снизить ремонтопригодность просто за счет создания значений, которые нельзя или не следует изменять в будущем.

В общем, я предпочитаю не объявлять явные значения, если сами значения по какой-то причине не являются значимыми. - если ваше перечисление C #, например, является оболочкой для перечисления C.

12
ответ дан 1 December 2019 в 19:50
поделиться

это полезно, когда вам нужно иметь отрицательные значения

enum
{
  Error = -1,
  Success = 0,
  Something1, 
  Something2,
};
7
ответ дан 1 December 2019 в 19:50
поделиться

Вы можете использовать Enum1, если вам нужны значения, которые не являются смежными.

enum Colors 
{ 
    Red = 1, 
    Green = 2, 
    Blue = 4, 
    Yellow = 8 
};

Кроме того, явная установка чисел легче читается, а добавление значения в середине не меняет никаких других значений.

5
ответ дан 1 December 2019 в 19:50
поделиться

Полезно явно устанавливать значения, если они имеют какое-то значение вне вашей программы. Например, приложение может записать файл журнала, который использует значение Severity, которое вы можете использовать для фильтрации файла журнала позже. Явная установка значений в Enum означает, что вы можете использовать Enum в своем коде (например, Critical, Error, Warning) вместо числовых значений. В файл журнала вам нужно записать числовое значение для упрощения сортировки.

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

3
ответ дан 1 December 2019 в 19:50
поделиться

Используйте пример 1, если вам действительно нужны числа (т.е. вам нужно знать, что something2 фактически равно 2)

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

2
ответ дан 1 December 2019 в 19:50
поделиться

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

1
ответ дан 1 December 2019 в 19:50
поделиться

это зависит от того, что вы делаете с перечислениями. Если вы используете их с [Flags], вы ДОЛЖНЫ установить их явно. если нет, то с точки зрения кодирования работает любой способ. однако для удобства чтения или (как уже упоминалось) использования в ситуации с базой данных вы должны явно установить их. Еще одно соображение - стандарты кодирования вашего рабочего места, а также сериализация.

1
ответ дан 1 December 2019 в 19:50
поделиться

Перечисление 1 также необходимо, когда вам нужно использовать помеченные перечисления: http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx

1
ответ дан 1 December 2019 в 19:50
поделиться

Если вам нужен только набор int-подобных констант, значения которых не важны, используйте значение по умолчанию. Если значения имеют значение, установите их.

Примером значимых значений является создание значений для битовых флагов, которые можно установить примерно так:

> enum 
{
    flag1 = 1;
    flag2 = 2;
    flag3 = 4;
};

func1(flag1 | flag3);
1
ответ дан 1 December 2019 в 19:50
поделиться
Другие вопросы по тегам:

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