Другое важное, но тонкое различие между 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.
Enum1 и Enum2 компилируются в одно и то же перечисление. Так что с точки зрения программирования разницы нет. С точки зрения обслуживания проблем может быть, а может и не быть.
С одной стороны, объявление явных значений абсолютно необходимо для перечисления [Flags]
; и они должны быть значениями в степени 2.
С другой стороны, явные значения могут снизить ремонтопригодность просто за счет создания значений, которые нельзя или не следует изменять в будущем.
В общем, я предпочитаю не объявлять явные значения, если сами значения по какой-то причине не являются значимыми. - если ваше перечисление C #, например, является оболочкой для перечисления C.
это полезно, когда вам нужно иметь отрицательные значения
enum
{
Error = -1,
Success = 0,
Something1,
Something2,
};
Вы можете использовать Enum1, если вам нужны значения, которые не являются смежными.
enum Colors
{
Red = 1,
Green = 2,
Blue = 4,
Yellow = 8
};
Кроме того, явная установка чисел легче читается, а добавление значения в середине не меняет никаких других значений.
Полезно явно устанавливать значения, если они имеют какое-то значение вне вашей программы. Например, приложение может записать файл журнала, который использует значение Severity, которое вы можете использовать для фильтрации файла журнала позже. Явная установка значений в Enum означает, что вы можете использовать Enum в своем коде (например, Critical, Error, Warning) вместо числовых значений. В файл журнала вам нужно записать числовое значение для упрощения сортировки.
Я также видел перечисление, используемое для представления значений в справочной таблице базы данных. В этом случае вы хотите убедиться, что элементы в перечислении всегда имеют то же значение, что и таблица базы данных, и что вставка нового элемента в середину перечисления не приводит к искажению значений.
Используйте пример 1, если вам действительно нужны числа (т.е. вам нужно знать, что something2 фактически равно 2)
Для всех другие варианты не используют числа. таким образом, вы могли бы с радостью добавить дополнительные элементы в свое перечисление, не нарушая какой-либо другой код, указав ссылку на ваше перечисление.
Я столкнулся с проблемами сериализации перечислений, которые не содержат значение 0, когда используя их через интерфейс веб-сервисов.
это зависит от того, что вы делаете с перечислениями. Если вы используете их с [Flags], вы ДОЛЖНЫ установить их явно. если нет, то с точки зрения кодирования работает любой способ. однако для удобства чтения или (как уже упоминалось) использования в ситуации с базой данных вы должны явно установить их. Еще одно соображение - стандарты кодирования вашего рабочего места, а также сериализация.
Перечисление 1 также необходимо, когда вам нужно использовать помеченные перечисления: http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx
Если вам нужен только набор int-подобных констант, значения которых не важны, используйте значение по умолчанию. Если значения имеют значение, установите их.
Примером значимых значений является создание значений для битовых флагов, которые можно установить примерно так:
> enum
{
flag1 = 1;
flag2 = 2;
flag3 = 4;
};
func1(flag1 | flag3);