代码之家  ›  专栏  ›  技术社区  ›  Mike Woodhouse

这是ruby中&&=的合理用法吗?

  •  7
  • Mike Woodhouse  · 技术社区  · 15 年前

    SO question 2068165 一个答案提出了这样的想法:

    params[:task][:completed_at] &&= Time.parse(params[:task][:completed_at])
    

    作为一种干巴巴的说法

    params[:task][:completed_at] = Time.parse(params[:task][:completed_at]) if params[:task][:completed_at]
    

    其中params散列将来自(rails/actionview)表单。

    这是众所周知的 ||= 习惯用法,如果lhs是 零/假。

    正在使用 &&= 像这样一个公认的ruby习惯用法,我不知怎么错过了,还是忘记了一个更常用的习惯用法?它 太晚了…

    2 回复  |  直到 12 年前
        1
  •  5
  •   C. K. Young    15 年前

    应该是的。如果没有别的, params[:task] 在使用 &&= 形式。

    澄清:

    params[:task][:completed_at] = params[:task][:completed_at] && ...
    

    电话 [](:task) params 两次, [](:completed_at) []=(:completed_at) 每一次 参数[:任务] .

    params[:task][:completed_at] &&= ...
    

    电话 [](任务) 帕拉姆 一次,它的价值被藏起来 [](:已完成) []=(完成时间) 电话。


    描述我试图说明的实际示例(基于Marc Andre的示例代码;非常感谢):

    class X
      def get
        puts "get"
        @hash ||= {}
      end
    end
    
    irb(main):008:0> x = X.new
    => #<X:0x7f43c496b130>
    irb(main):009:0> x.get
    get
    => {}
    irb(main):010:0> x.get[:foo] = 'foo'
    get
    => "foo"
    irb(main):011:0> x.get[:foo]
    get
    => "foo"
    irb(main):012:0> x.get[:foo] &&= 'bar'
    get
    => "bar"
    irb(main):013:0> x.get[:foo] = x.get[:foo] && 'bar'
    get
    get
    => "bar"
    

    请注意,使用“扩展”表单会导致“get”打印两次,但使用压缩表单会导致它只打印一次。

        2
  •  1
  •   bryantsai    15 年前

    使用 &&= ,在lhs为false的情况下,它只被读取一次,但不被设置。这会让事情更清楚…

    class Test
      def initialize(value)
        @v = value
      end
      def v=(value)
        puts "set"
        @v = value
      end
      def v
        puts "get=>#{@v}"
        @v
      end
    end
    t = Test.new(true)
    
    t.v = t.v && true
    puts '----'
    
    t.v &&= true
    puts '----'
    
    t = Test.new(false) # lets make LHS false
    t.v = t.v && true
    puts '----'
    
    t = Test.new(false) # lets make LHS false
    t.v &&= true
    

    结果:

    get=>true
    set
    ----
    get=>true
    set
    ----
    get=>false
    set
    ----
    get=>false
    
    推荐文章