【问题标题】:Local variable ternary assignment in slimslim中的局部变量三元赋值
【发布时间】:2015-09-15 04:19:50
【问题描述】:

我有一个像这样的苗条部分:

- name = (defined?(name) ? name : 'tags')
- id = (defined?(id) ? id : ('input-' + name))
- label = defined?(label) ? label : nil
- placeholder = defined?(placeholder) ? placeholder : nil
- className = defined?(className) ? className : nil
- prefetch = defined?(prefetch) ? prefetch : nil
- displayKey = defined?(displayKey) ? displayKey : nil
- valueKey = defined?(valueKey) ? valueKey : nil

.input-container.tags
  - if label
    label for="#{id}" = label
  input type="text" id="#{id}" name="#{name}" placeholder="#{placeholder}" data-prefetch="#{prefetch}" data-displayKey="#{displayKey}" data-valueKey="#{valueKey}"

当我使用它(通过 ==render)并在里面传递本地人时——一切都很好。

但是,例如,当我省略名称时,它不会分配给默认的“标签”。 id 也是如此。它们只是空的。如果我在一开始就注释掉分配 - 未定义的变量错误会引发,正如预期的那样。

作业有什么问题?

【问题讨论】:

    标签: ruby-on-rails ruby slim-lang


    【解决方案1】:

    你不需要苗条。只需irb代码:

    name = (defined?(name) ? name : 'tags')
    p name #=> nil
    

    它不起作用,因为您在语句 name = ... 的左侧隐式定义了 name。因此,当 Ruby 解释器评估 defined?(name) 时,它会给出真正的结果。

    我想你已经得到答案了:

    unless defined?(name)
      name = 'tags'
    end
    

    或更短:

    name ||= 'tags'
    

    【讨论】:

    • 哦,太好了,- name ||= 'tags' 有效,非常方便。单行- unless defined?(name) then name = 'tags' 也可以达成交易。但是为什么三元不能按预期工作呢?
    • 因为您实际上在调用 define?(name) 之前定义了 namename = ...
    • 非常奇怪的行为... ruby​​ 中的另一个奇怪之处 =)) 谢谢你的解释
    • 其实很漂亮:)))
    • @ВладимирКорнилов 我在回答中添加了对行为的描述。
    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2013-08-02
    • 2011-11-06
    • 2018-01-12
    相关资源
    最近更新 更多