02.05.2011, 19:38
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от B@rmaley.e><e
|
Целью было обеспечение гарантированной установки значения по-умолчанию, т.е. так, чтобы уже на входе в функцию мы имели дело либо с настоящими значениями, либо стандартными.
|
а если делать так?
function arr_cycle ( arr, func ) {
// явл. ли массивом
if ( arr.constructor !== Array ) throw new Error( "'arr' must be Array" );
for ( var i = 0; i < arr.length; i++ )
i in arr && func.apply(window, [ arr[i], i, arr ] );
}
правда, очень жаль, что изза такой типизации в JS нельзя использовать оверлоадинг ( перегрузки )
приходится внутри всей функции проверять тип аргумента и только потом расфасовывать методы
|
|
02.05.2011, 19:57
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
melky, и что это? Во-первых, где тут значения по-умолчанию, а во-вторых, что помешает Вам написать какой-нибудь код, оперирующий с arr, до проверки?
|
|
02.05.2011, 20:01
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
вот значения по-умолчанию. про это забыл
...
if ( arr = arr || [] ).constructor ...
но если ведь необходимо оперировать только с массивами, то как еще ?
|
|
02.05.2011, 20:40
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Это и есть стандартный подход.
|
|
02.05.2011, 21:18
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от B@rmaley.e><e
|
Этого я и добивался. Что в C, что в php значения по-умолчанию задаются вне тела функции.
|
нет, я говорил "вне функции". С таким подходом надо создать обертку для каждой функции и использовать функцию только через нее (чтобы не дублировать значения по умолчанию):
function f(a, b){alert(this); return a + b}
function fWrapper(){
return lambda(f, 'Hello, world!', {a: 50, b: 77, c: 42});
}
к тому же lambda навязывает задание контекста, т.е. контекст для методов надо либо жестко прописывать в обертке (но тогда нельзя будет вызвать метод в другом контексте), либо указывать при каждом вызове
Сообщение от B@rmaley.e><e
|
Целью было обеспечение гарантированной установки значения по-умолчанию, т.е. так, чтобы уже на входе в функцию мы имели дело либо с настоящими значениями, либо стандартными.
|
ну вот я и говорю, что вы пытаетесь изменить язык. Такие вещи вызывают много проблем, и для этого нужны веские причины. А для надежности нужно тестировать код
Сообщение от B@rmaley.e><e
|
а во-вторых, что помешает Вам написать какой-нибудь код, оперирующий с arr, до проверки?
|
а что помешает сделать ошибку или опечатку в другом месте? Например, вызвать функцию с другими значениями по умолчанию или забыть воспользоваться оберткой
Сообщение от melky
|
правда, очень жаль, что изза такой типизации в JS нельзя использовать оверлоадинг ( перегрузки )
приходится внутри всей функции проверять тип аргумента и только потом расфасовывать методы
|
во-первых не жалко, во-вторых, можешь привести конкретный пример, где по-твоему нужна перегрузка?
Последний раз редактировалось x-yuri, 02.05.2011 в 21:24.
|
|
02.05.2011, 21:32
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Сообщение от x-yuri
|
к тому же lambda навязывает задание контекста, т.е. контекст для методов надо либо жестко прописывать в обертке (но тогда нельзя будет вызвать метод в другом контексте), либо указывать при каждом вызове
|
Это особенность текущей реализации, которая не имеет отношения к аргументам по-умолчанию.
Сообщение от x-yuri
|
нет, я говорил "вне функции". С таким подходом надо создать обертку для каждой функции и использовать функцию только через нее (чтобы не дублировать значения по умолчанию):
function f(a, b){alert(this); return a + b}
function fWrapper(){
return lambda(f, 'Hello, world!', {a: 50, b: 77, c: 42});
}
|
К чему этот код? Вы собираетесь использовать одну функцию с разными аргументами по-умолчанию? Функция сразу должна быть создана через lambda.
Сообщение от x-yuri
|
а что помешает сделать ошибку или опечатку в другом месте? Например, вызвать функцию с другими значениями по умолчанию или забыть воспользоваться оберткой
|
Функцию Вы объявляете один раз, а ее тело может правиться много и долго. Как забыть обертку - не понял.
|
|
02.05.2011, 21:36
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от x-yuri
|
можешь привести конкретный пример, где по-твоему нужна перегрузка?
|
если придумать код, а потом попробовать перевести его на JS, то решить можно все. и правда.
но передавать объекты ,как один аргумент, будет удобнее
Код:
|
function doetc( string a, int b, float c, element d ) {
/* code */
}
function doetc( object options ) {
doetc( options.a, options.b, options.c, options.d );
}
//example
function hide( element a, int b ){
doetc ( "hide", b, 0.0, a);
} |
|
|
02.05.2011, 22:42
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от B@rmaley.e><e
|
Это особенность текущей реализации, которая не имеет отношения к аргументам по-умолчанию.
|
ну извини, я как-то расчитывал, что ты приводишь готовый к использованию код. А решить да, можно, надо чтобы lambda сохраняла контекст. И, кстати, это лишняя функциональность в lambda. Это следует хотя бы из ее описания: она назначает значения по умолчанию и задает контекст. У нее слишком много обязанностей. И это плохо.
Сообщение от B@rmaley.e><e
|
К чему этот код? Вы собираетесь использовать одну функцию с разными аргументами по-умолчанию? Функция сразу должна быть создана через lambda.
|
я исходил из того, как ты использовал эту функцию и не подумал, что с помощью нее подразумевается создавать функции, а не выполнять
B@rmaley.e><e, давай лучше на ты
melky, у тебя абстрактный пример, а я просил конкретный
|
|
|
|