首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用‘μn’访问关键字列表的意外行为

使用‘μn’访问关键字列表的意外行为
EN

Stack Overflow用户
提问于 2016-06-15 09:17:15
回答 2查看 45关注 0票数 0

在我的模板(html.eex文件)中,我试图使用关键字列表来传递选项。我有:

代码语言:javascript
复制
<%= if :layer1 in @buttonCSS do %><%= @buttonCSS[:layer1] %><% end %>

然后,我传递这样的值,在其中我使用模板:

代码语言:javascript
复制
<%= render MyProject.ComponentView, "button.html",
    buttonCSS: [layer1: "font-style: italic;"]
%>

如果我不使用if条件,这是可行的。那么,in不应该在这里工作吗?

我尝试过只使用layer1而不是:layer1,但后来出现了一个错误。

PS:还有,为什么使用.layer1而不是[:layer1]不起作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-15 09:20:09

由于关键字列表只是列表,in实际上检查列表中是否存在整个键/值对:

代码语言:javascript
复制
iex(1)> :a in [a: 1]
false
iex(2)> {:a, 1} in [a: 1]
true

您应该检查@buttonCSS[:layer1]是否真实,因为一个不存在的键将返回nil,这是错误的:

代码语言:javascript
复制
<%= if @buttonCSS[:layer1] do %>
  <%= @buttonCSS[:layer1] %>
<% end %>

如果实际上只是在if中打印值,则可以跳过if并直接打印值,因为打印nil不会打印任何内容:

代码语言:javascript
复制
<%= @buttonCSS[:layer1] %>

演示:

代码语言:javascript
复制
iex(1)> EEx.eval_string "<%= @buttonCSS[:layer1] %>", assigns: [buttonCSS: [layer1: "foo"]]
"foo"
iex(2)> EEx.eval_string "<%= @buttonCSS[:layer1] %>", assigns: [buttonCSS: []]
""

PS:还有,为什么使用.layer1而不是[:layer1]不起作用?

点语法只适用于Maps (以及模块中的函数),而不适用于关键字列表。如果你有:

代码语言:javascript
复制
buttonCSS: %{layer1: "font-style: italic;"}

但是请注意,点语法与[]不完全相同:如果一个键不存在,它会抛出一个错误,而不是返回nil

票数 2
EN

Stack Overflow用户

发布于 2016-06-15 09:19:35

在查找可枚举元素时,应该使用in/2 (使用遮罩下的成员?/2 )。

代码语言:javascript
复制
iex> :foo in [:foo]  
true
iex> :foo in [foo: :bar]
false

但是,这将有效,因为如果没有设置@buttonCSS[:layer1],它将返回零。

代码语言:javascript
复制
<%= @buttonCSS[:layer1] %>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37831168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档