关于函数中的匿名函数的调用问题

看到文档 9.5 匿名函数

x -> x^2 + 2x - 1

等效于

function (x)
    x^2 + 2x - 1
end

也了解到,匿名函数作为传参时比较方便

1.我想知道案例中给的

get(dict, key) do
    time()
end

等效于

get(()->time(), dict, key)

是想表达什么

2.我想知道 无参函数 ()-> 的作用,以及调用

 ()->

还看到有这样的用法 https://discourse.juliacn.com/t/topic/560

function Person(age)
    getAge() = age
    ()->(age;getAge)
end

p = Person("run", 10)
p.age
p.getAge()

谢谢您的回答!

是想表达什么

可能这个的重点是 do(?

2.我想知道 无参函数 ()-> 的作用,以及调用

同上,()->expr 等价于

function()
    expr
end
function Person(age)
    getAge() = age
    ()->(age;getAge)
end

p = Person("run", 10)
p.age
p.getAge()

虽然但是,这个代码不能运行啊

哦,我明白你意思了。这个代码定义了一些局部函数,而最后一个函数作为返回值,使得可以从外部触及这些东西。

julia> y=(w)->(()->(w;))
#13 (generic function with 1 method)

julia> o=y(5)
#14 (generic function with 1 method)

julia> o.w
5

这应该是什么奇怪的特性,但是正常人谁这么写啊

ლ(╹◡╹ლ ) 好谢谢回答!

原来是按返回值来理解,很奇怪的写法哇
所以说这个无参匿名函数其实很少应用对么,没想到能用在什么地方

Example from with_logger:

# 将 @info 写入到文件
io = open("log.txt", "w+")
logger = SimpleLogger(io)
with_logger(logger) do
    @info("a context specific log message")
end
1 个赞

不是这样的,很少应用的是最后那种东西

再贴个例子

julia> cd("D:/") do
           readdir()
       end
2 个赞

是想表达什么

get(dict, key) do
    time()
end

do-syntax 只不过是函数调用的语法糖。这里想表达的是类似 get(collection, key, default) 的用法:get(f::Function, collection, key),如果 get(collection, key) 没有这个 key, 就默认返回 f() 的值,只不过 Julia 一般把函数 f 写成第一个参数。

还看到有这样的用法 https://discourse.juliacn.com/t/topic/560

@woclass 在抄这个例子的时候抄错了,应该是没有 age 这个变量的,Jeff 原始的写法是:

function Person(name, age)
    getName() = name
    getAge() = age
    getOlder() = (age+=1)
    ()->(getName;getAge;getOlder)
end

julia> p = Person("Jack", 1)
#1 (generic function with 1 method)

julia> typeof(p)
var"#1#5"{var"#getOlder#4", var"#getAge#3", var"#getName#2"{String}}

这个想法也很简单,匿名函数 ()->(getName;getAge;getOlder) 是一个 closure, 封装了 getName, getAge, 和 getOlder 这三个函数,显然 age 在这里是一个 private 变量,不应该直接 access 的。
这个就是用 closure 实现了一个简单的 classic OOP 的写法。
想要了解得更详细,可以参看 Closures give us “Classic Object-Oriented Programming”.