2017-10-04 53 views
2

我有以下的(人为)代码:我如何从一个回调访问超出范围的一个变量药剂

dbconn # this var holds the database connection 
get_from_cache("missing_key") 

defp get_from_cache(key) do 
    Cachex.get(:my_cache, key, fallback: &from_db/1) 
end 

defp from_db(key) do 
    select_from_db(dbconn) 
end 

的CacheX包说,我可以添加一个回退功能,这将被称为如果在缓存中找不到密钥。但是这个功能需要的不仅仅是关键。我知道我必须在这里丢失一些东西,但是如何从Elixir中的回调中访问dbconn变量?

回答

3

而不是一个名为函数的引用,你可以通过一个匿名函数来Cachex.get可以访问功能之外声明的变量:

# dbconn holds the database connection 
Cachex.get(:my_cache, "missing_key", fallback: fn _key -> 
    select_from_db(dbconn) 
end) 
+0

如果该dbconn变量不是“近”,范围明智,但是在调用堆栈的某个函数中。除了一路将它传下去之外,没有别的选择吗? – raarts

+1

你可以发布一些示例代码?变量是词汇范围的,匿名函数可以访问定义多个级别的变量:'x = 1; (fn→fn→fn→x end end end)。()。()。()#=> 1'。 – Dogbert

+0

我修改了一下这个问题 – raarts