看到文档 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”.