2009-05-08 3 views
11

Я хотел бы реализовать следующую логику:AS3: объявляя «неопределенный» параметр для INT, UINT или номер

function setMyValue (myVar:int = undefined):void 
{ 
    if (myVar == undefined) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

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

Проблема в том, что AS3 не нравится. «undefined» принуждается к «0», поэтому myVar никогда не бывает неопределенным. Я пробовал варианты с NaN, null и т. Д., Но ничего не сработало. Единственный кулдж, о котором я могу думать, - это указать «магическое число» для использования по умолчанию, но это уродливо. Кто-нибудь знает лучшее решение?

Спасибо!

+0

Ах, хорошо, номер немного отличается. Номер по умолчанию - NaN, так что экземпляр можно обрабатывать с помощью isNaN (myVar). Тем не менее, все же хочется решить для int и uint. – Wikiup

ответ

14

UPD (от моего комментария): Это, конечно, не очень хорошая практика, чтобы выбрать какое-то магическое число, чтобы указать значение отсутствия, если вы не можете быть полностью уверены, что это магическое число не будет появляться в результате некоторых арифметика (что в целом верно). Поэтому лучше всего использовать более широкий тип, чем int (например, Number), или передать некоторый флаг (Boolean) для функции, а также int, чтобы указать отсутствие фактического значения. Выбор должен зависеть от того, хотите ли вы подчеркнуть важность факта, что прошедшее значение является целостным.


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

function setMyValue (myVar : Number = NaN) : void 
{ 
    if (isNaN(myVar)) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

То есть как технически более точным и она более устойчива. Он также позволит вам строго печатать во время компиляции и не будет вызывать странные ошибки, как в случае использования Object.

Обратите внимание, что это не будет работать с int, как предлагает один из ответов. int имеет только числовые значения, а NaN будет привязано к 0. Вам нужно будет использовать Number.

Если вы беспокоитесь о производительности - не следует. Использование Number вместо int или uint в целом нормально.


UPD: Если вы хотите явно отметить, что аргумент должен быть неотъемлемой частью просто использовать дополнительный флаг и точный тип - это было бы гораздо яснее.

function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void 
{ 
    if (isIntValueSupplied) 
    { 
     /* Generate or use a default value of intValue */ 
    } 
    else 
    { 
     /* Use the supplied value for intValue */ 
    } 
} 

Другой вариант определить собственный тип с дополнительным значением, например, MaybeInt, который содержит целочисленное значение и флаг (независимо от того, был ли он фактически инициализирован или нет). Таким образом, вы четко указали бы, что значение должно быть целым или no-value. Однако этот подход может быть немного громоздким.

+0

Это, безусловно, приближается, поскольку, по крайней мере, я буду знать, что это число, проходящее через парам (который я могу затем перебросить в int/uint), но это касается той же проблемы, что и моя проблема с ответом dirkgently. Действительно ли это чистое приведение к неправильному типу данных? Возможно, я просто прошу чего-то, что невозможно сделать по-настоящему чистым способом. Кстати, это не имеет никакого отношения к производительности как таковой. Я просто пытаюсь установить передовой подход к этой проблеме. Спасибо за помощь! – Wikiup

+0

@Wikiup: Конечно, не очень хорошая практика выбрать какое-либо магическое число, чтобы указать отсутствие ценности, если вы не можете быть полностью уверены, что это волшебное число не появится в результате какой-либо арифметики (что обычно верно). Поэтому лучше всего использовать более широкий тип, чем 'int' (например,' Number'), или передать некоторый флаг ('Boolean' value) для функции, а также' int', чтобы указать отсутствие фактического значения. Выбор должен зависеть от того, хотите ли вы подчеркнуть важность факта, что прошедшее значение является целостным. – dragonfly

+0

Я думаю, что ваш комментарий обеспечивает гораздо лучшее решение «лучшей практики», чем ваш оригинальный ответ. Я согласен с тем, что магические числа редко бывают хорошей идеей (в конце концов, суть моего первоначального размещения). function setMyValue (useSuppliedValue: Boolean = false, providedValue: int = 0), в то время как wordier, кажется, обеспечивает менее двусмысленный формат для метода; это кажется мне довольно солидным ответом. Если вы хотите отредактировать свой ответ и написать его как таковой, я с радостью проведу «ответ» и призову вас к точкам репутации. : c) Большое спасибо! – Wikiup

2

Является ли сгенерированное значение a const? Если это так, почему бы просто не использовать это значение по умолчанию?

Проблема в том, что AS3 не нравится. «undefined» принуждается к «0», поэтому myVar никогда не бывает неопределенным.

Да, потому, что это значение по умолчанию для инициализации int (для string и Object this'd быть null).

Другой вариант заключается в свободно ввести параметр как Object или сохранить его не определено (с помощью *), а затем на нее, чтобы напечатанный int, если она отлична от null.

function setMyValue (myVar:Object = null):void 
{ 
    if (myVar == null) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     int value = myVar as int; 
     /* Use the supplied value for myVar */ 
    } 
} 
+0

Оцените быстрый ответ. Сгенерированное значение не является константой; он должен быть сгенерирован во время вызова метода. Думаю, мой вопрос был бы свободным - набирать этот способ любым чище, чем использовать магический номер? Выполнение этого так, как вы предполагаете, означало бы, что мне нужно будет очистить данные, чтобы я не получил незаконную ценность (строка/номер/микрофон). По крайней мере, используя магическое число, разработчик должен знать требуемый тип данных. Я бы просто подумал, что должен быть более чистый способ сделать это. – Wikiup

+0

BTW, я любил тебя в «Длинном темном чае ...»; c) – Wikiup

2

Мое решение было просто использовать этот

if(myUint == new uint){ is undefined, act appropriately; } 
+0

Проблема в том, что (new uint == 0) разрешает true. Итак, вы действительно просто тестируете, если myUint == 0. –

0
function setMyValue (myVar:int = -1):void 
{ 
    if (myVar == -1) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^