朱莉娅的功能可以匹配特定的符号吗?

时间:2016-06-05 16:25:53

标签: julia

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");

以上是我试图完成的,虽然语法错误。

1 个答案:

答案 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%的情况下,这是一个坏主意。请记住,这在调用函数时不会阻止分支,事实上它会变慢,因为调度比分支更昂贵。