什么是ruby功能呢

Wiz*_*ard 1 ruby ruby-on-rails

在这个项目我捅,(我是PHP开发,而不是RoR),在模态上有这个功能.

  def task 
    @task ||= if search_key 
      Project.trop_fish.tasks.find(:first, :conditions => ["description like ?", "Search key: #{search_key}%"]) 
    else 
      Project.trop_fish.tasks.find(:first, :conditions => ["(name = ? OR name like ?)","#{task_name}","#{task_name} {%}"]) 
    end 
  end
Run Code Online (Sandbox Code Playgroud)

所以它试图从名为trop_fish的项目中找到一项任务.但最重要的是@task.

是吗,将if块的查找结果分配给@task?

它是一样的吗?

  def task 
    if search_key 
      @task = Project.trop_fish.tasks.find(:first, :conditions => ["description like ?", "Search key: #{search_key}%"]) 
    else 
      @task = Project.trop_fish.tasks.find(:first, :conditions => ["(name = ? OR name like ?)","#{task_name}","#{task_name} {%}"]) 
    end 
  end
Run Code Online (Sandbox Code Playgroud)

Bat*_*ins 5

几乎,不完全.与此相同:

def task 
  if search_key 
    @task ||= Project.trop_fish.tasks.find(:first, :conditions => ["description like ?", "Search key: #{search_key}%"]) 
  else 
    @task ||= Project.trop_fish.tasks.find(:first, :conditions => ["(name = ? OR name like ?)","#{task_name}","#{task_name} {%}"]) 
  end 
end
Run Code Online (Sandbox Code Playgroud)

||=指示变量才会被设置为新的值,如果它不被用不同的值设置.正如一些人评论指出/更简单地说,@task如果它是nil或将被设置为新值false.

Michael Hartl 的RoR教程这一部分是对||=运营商的一个很好的解释.

@pguardino提出了一个很好的观点,即PHP程序员可能不熟悉这样一个事实:如果returnruby中的方法中没有显式语句,它将返回方法中的最后一个非条件语句,因为它是返回值,所以是的,@task正在退货.

这里是文字的另一位在回报率教程这就解释了为什么这是有利的是使用||=从方法返回时操作.它很有用,因为它意味着对方法的第一次调用task将对数据库执行操作以检索任务,但是在同一线程内对该方法的后续调用将返回@task而不调用数据库(因为该@task变量已被设置.

  • @ 32bitkid实际上`x || = y`相当于`x || x = y` - 这是一个微妙的差异,大部分时间没有任何影响 - http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html (3认同)