您可以定义一个函数,将其关键字参数传递给内部函数,如下所示:
function example(data;xcol,ycol,kwargs...)
DoSomething(; spec=:EX, x=xcol, y=ycol, kwargs...)
end
现在,函数DoSomething
接受许多参数,例如color
。这适用于函数,但是我想使用VegaLite.jl中的宏来做到这一点:
function example(data;xcol,ycol,kwargs...)
@vlplot(data=data,mark=:point, x=xcol, y=ycol,kwargs...)
end
example(df,xcol=:Miles_per_Gallon, ycol=:Horsepower, color=:Origin)
请注意,上面的代码不起作用。
答案 0 :(得分:4)
所以这里的答案是...很棘手。实际上,通常,除非宏本身支持,否则这是不可能的。
看,宏在解析时进行转换-经常会利用您实际编写的的含义来表达不同而又特殊的含义。例如,@vlplot
将专门处理并支持类似JSON的{}
语法。这些不是有效的Julia代码,无法传递给您定义的函数(如example
)!
现在,很容易看到这一点,并认为,好吧,让我们也将外部example
的东西变成一个宏!但这不是那么容易。我不确定是否有一个总的答案能够始终正确地传递参数,并且 使卫生正确无误。我很确定您需要了解有关所调用的宏如何处理其参数的知识。
答案 1 :(得分:3)
您需要在let array = [
{
Items: [
'a',
'b',
'c'
],
Name: 'Test1'
},
{
Items: [
'd',
'e',
'f'
],
Name: 'Test2'
}
];
let itemsCount = 5;
let filteredArray = [];
array.some(group => {
if (itemsCount <= 0) {
return true;
}
if (group.Items.length <= itemsCount) {
itemsCount -= group.Items.length;
} else {
group.Items = group.Items.slice(0, itemsCount);
itemsCount = 0;
}
filteredArray.push(group);
});
console.log(filteredArray);
之前添加;
,以表明它们不是kwargs
的位置参数,例如:
kwargs
(这是DoSomething(;spec=:EX, x=xcol, y=ycol, kwargs...)
作为函数的答案,因为这是问题的原始表述)