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