2017-03-11 5 views
1

他の関数の引数として関数を受け取り、その引数の数を知りたいと思います。これは可能ですか?例えば関数の引数の数を取得する

@function foo($list, $fn) { 
    if (number-of-arguments($fn) == 1) { // looking for this kinda magic 
    // ... 
    } 
} 

だけXY-問題を回避するために、ケースには上記ができない、私がやろうとしていることcallでエラーを無視することです余分な引数を与える:$fnが1つだけの引数を取るように定義されている場合、call($fn, $arg1, $arg2)は失敗します。現在のところ、これは失敗します:Error: wrong number of arguments (2 for 1) for 'fn'。私はまたtry/catchメカニズムを望んだが、Sassにもそのような概念はない。

答えて

1

ありそれを行うにはイントロスペクション機能はありませんが、あなたは次のようにマップに基づいた検証を行うことができます:

// dummy functions 
@function fn1($a){ @return $a; } 
@function fn2($a, $b){ @return $a + $b; } 
@function fn3($a, $b, $c){ @return $a + $b + $c; } 

@function foo(
    $fn,  // function name as string 
    $args... // arglist 
){ 

    // arguments passed 
    $args-passed: length($args); 

    // arguments required by functions 
    $args-required: map-get((
    fn1: 1, // fn1 takes 1 argument 
    fn2: 2, // fn2 takes 2 arguments 
    fn3: 3 // fn3 takes 3 arguments 
), $fn); 

    // match => make call 
    // no match => throw warning or error or do something else 
    @if $args-passed == $args-required { 
    @return call($fn, $args...); 
    } @else { 
    @warn 'function `#{$fn}` requires #{$args-required} arguments #{$args-passed} were passed '; 
    @return null; 
    } 
} 


test { 
    value-1: foo(fn1, 1);  
    value-2: foo(fn2, 1, 2); 
    value-3: foo(fn3, 1, 2); 
} 

出力:

test { 
    value-1: 1; 
    value-2: 3; 
    // value-3 receives null and is not printed but a warning is thrown 
    // "function `fn3` requires 3 arguments 2 were passed" 
} 
関連する問題