Julia函数是否可以匹配特定符号而不仅仅是符号类型?例如:
var friends = { steve: { firstName: "Steve", lastName: "smith", number: "8861785484", address: ['rajajinagar', 'bangalore', '560010'] }, bill: { firstName: "Bill", lastName: "gates", number: "9845378136", address: ['shivajinagar', 'bangalore', '560018'] } },
search = function (name) {
for (k in friends) {
if (friends[k].firstName.toLowerCase() === name.toLowerCase()) {
console.log(friends[k]);
}
};
};
search("steve");
以上是我试图完成的,虽然语法错误。
答案 0 :(得分:3)
你真的想要为每个符号编译一个额外版本的函数吗?另外一个编译是非常昂贵的,编译器将不得不放入一个分支...你不会通过调度值获得任何性能。
相反,您应该编写这样的代码:
function test(x::Symbol)
if x == :ALPHA
...
elseif x == :BETA
...
else
throw(ArgumentError("Expected :ALPHA or :BETA"))
end
end
或者如果您不喜欢这种情况,请考虑使用与Match.jl匹配的模式:
test(x::Symbol) = @match x begin
:ALPHA => ...
:BETA => ...
_ => throw(ArgumentError("Expected :ALPHA or :BETA"))
end
如果确实需要调度,可以使用类型来包围值,例如Val{:ALPHA}
。需要在调用者站点创建此类型。在99%的情况下,这是一个坏主意。请记住,这在调用函数时不会阻止分支,事实上它会变慢,因为调度比分支更昂贵。