冒险村10 - or equals

10 - or equals

Ruby 的 ||=(or equals)运算符号使用频率是个使用频率满高又方便的方法。在举例实际会用到的情况之前,我们直接先讲最後实际的意定义:如果变数已经被定义,则不会改变变数,如果没有被定义,那就会赋值给变数。

所以是什麽意思呢?举例来说:

  my_name ||= "chester"
  # => "chester"
  my_name ||= "chester_2"
  # => "chester"

由此可见验证了上述的定义。但是,如果将变数等於 falsey 的值的情况时,则变数的值将会被更新

  my_name = nil
  my_name ||= "chester_falsey"
  # => "chester_falsey"

同样的在 hash 里面也可以利用相同的原理来理解

  hash = {}
  # => {}
  hash[:my_name] ||= "chester"
  # => "chester"
  hash
  # => {:my_name=>"chester"}
  hash[:my_name] ||= "chester_2"
  # => "chester"
  hash
  # => {:my_name=>"chester"}

什麽时候使用呢?

举个简单的例子来看,如果想要捞其中一种性别类型的 User 资讯时,在 each 回圈内 call 到 users 时就会去到下方的 def 来捞资料,并且只会捞一次存起来,在接下来的回圈中也不会重复的去捞,更能提升速度。

  # @users = UserPresenter.new("male")
  # @users.each ...(in view)

  class UserPresenter
    include Enumerable

    def initialize(gender)
      @gender = gender
    end

    def each(&_block)
      users.each do |user|
        yield format(user)
      end
    end

    def format(user)
      {
        name:         user.name,
        email:        user.email,
        backup_email: user.backup_email,
        company_name: user.company_name,
        phone_number: user.phone_number,
        # ...
      }
    end

    def users
      @_users ||= User.where(gender: gender)
    end
  end

不过小心如果捞的值每次都会不相同就不同使用这种方法来处理,不然跑第一次回圈 变数已经被定义,後面不管是什麽都 不会改变变数

My blog


<<:  Day-10 深度学习的介绍

>>:  CSS微动画 - 不知道要吃什麽?Slot帮你选吧

Servo控制

看到书上特别讲述Servo的控制 仔细看了一下 发现这个可分别控制到机器人的关节转动或是当成指示刻度...

Dungeon Mizarka 008

战斗实际制作Part02 承接昨天的攻击功能制作。拿取到定位点後要转换成Raycast再进行侦测。为...

DAY 5 『 RGB调色盘 - layout ( 约束 ) 』Part4

layout(约束) 拉法 我自己拉 layout 的话,我习惯先选某一个物件当作我的基准点。 例如...

Day10. User Story 与 UX / UI 设计流程

当概念验证过有价值且方向大致正确後,就会开始撰写 User Story,然後进入正式的 UX/UI ...

Day 10 - Laravel使用Phpunit做单元测试

Introduce 当API规模慢慢扩大,Unit test变得很重要,可以帮助我们检查原本已经正常...