【问题标题】:Operator !=~ in Ruby运算符 !=~ 在 Ruby 中
【发布时间】:2012-08-27 08:06:52
【问题描述】:

这是用于显示错误消息的代码

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance_tag|
  unless html_tag =~ /^<label/
    "<span class=\"field_with_errors\">#{html_tag}</span>".html_safe
  else
    "#{html_tag}".html_safe
  end
end

但是,最好不要同时使用unlesselse。所以我做到了

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance_tag|
  if html_tag !=~ /^<label/
    "#{html_tag}".html_safe
  else
    "<span class=\"field_with_errors\">#{html_tag}</span>".html_safe 
  end
end

它不工作。

我知道这是因为"!=~"。 那么,我该如何更改它以使其正常工作?

【问题讨论】:

  • unless 有什么问题尽管我不明白为什么人们不使用unlessif 一样有效,你可以使用not 尽管前面有if 之类的not(html_tag =~ /^&lt;label/) 希望这个帮助
  • 操作员是!~,但是你不想切换块中完成的操作。

标签: ruby


【解决方案1】:

您应该只使用=~。以下给出与unless 的原始代码相同的结果:

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance_tag|
  if html_tag =~ /^<label/
    "#{html_tag}".html_safe
  else
    "<span class=\"field_with_errors\">#{html_tag}</span>".html_safe 
  end
end

【讨论】:

  • 那我不明白为什么它工作?为什么unless html_tag =~ /^&lt;label/ 等于if html_tag =~ /^&lt;label/
  • 没有。恰恰相反,但您原来的 else 子句现在位于 if 中,反之亦然。这就是它起作用的原因。
【解决方案2】:

!=~ 不是 Ruby 运算符,因此它实际上标记为 != ~,这是一个完全不同的操作。因此,html_tag !=~ /^&lt;label/ 实际上测试了html_tag != ~/^&lt;label/,它等于html_tag != nil,这将始终为真。

你可以在这里看到这个:

>> "x" !=~ nil
NoMethodError: undefined method `~' for nil:NilClass
    from (irb):104
    from :0

你应该只使用普通的=~

【讨论】:

    【解决方案3】:

    上述的替代解决方案是使用 !~ 运算符,它是 =~ 的倒数。

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 2010-10-31
      • 2010-12-21
      • 2012-08-04
      • 2016-06-27
      • 2013-07-04
      • 2012-01-24
      • 2012-09-15
      相关资源
      最近更新 更多