Ruby on rails 定义类似于rails的链接ruby方法定义

Ruby on rails 定义类似于rails的链接ruby方法定义,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在研究Rails文档。在中,它们指定带有链的方法定义,如下所示: class Project < ActiveRecord::Base def portfolio.nil? ... end end 项目#公文包.nil 我觉得这很奇怪。似乎有一个实例方法定义上有一个链式方法。例如:Project#portfolio.nil?将定义一个如下所示的实例方法: class Project < ActiveRecord::Base def portfolio.n

我正在研究Rails文档。在中,它们指定带有链的方法定义,如下所示:

class Project < ActiveRecord::Base

  def portfolio.nil?
    ...
  end
end
项目#公文包.nil

我觉得这很奇怪。似乎有一个实例方法定义上有一个链式方法。例如:
Project#portfolio.nil?
将定义一个如下所示的实例方法:

class Project < ActiveRecord::Base

  def portfolio.nil?
    ...
  end
end
然而,这不起作用。出现
名称错误

NameError:未定义的局部变量或Dog:Class的方法“speak”

如果它真的有效:那么我会尝试
Dog.new.speak.fetch
。我不确定它会返回什么。也许它会回来:

=> woof woof!
=> go get the ball!

问题:是否有可能以某种方式定义实例方法定义,并在其上加上这样的链?如果不是:rails是如何做到的?以
Project#portfolio.nil?
为例:Rails如何定义
#portfolio.nil?

让我们从一件基本的事情开始:

在Ruby中,没有原语。一切都是物体。人人都有一个 公共祖先,对象类

所以,当您使用点表示法时,您可以从对象调用方法

当您使用
nil?
时,这意味着您调用方法来检查
对象是否等于nil。您可以从任何对象调用此方法:

Object.nil? # => false
在您的代码中,您有
项目
模型,该模型具有关联
Portofolio

class Project < ActiveRecord::Base
  belongs_to :portfolio
end

结束语:当你调用任何方法时,你都是从某个对象调用它。

让我们从一件基本的事情开始:

在Ruby中,没有原语。一切都是物体。人人都有一个 公共祖先,对象类

所以,当您使用点表示法时,您可以从对象调用方法

当您使用
nil?
时,这意味着您调用方法来检查
对象是否等于nil。您可以从任何对象调用此方法:

Object.nil? # => false
在您的代码中,您有
项目
模型,该模型具有关联
Portofolio

class Project < ActiveRecord::Base
  belongs_to :portfolio
end
结束语:当您调用任何方法时,您都是从某个对象调用它。

这只是Rails文档中的一个bug(或者,让我们称之为一个有点误导性的措辞)。引自:

project类现在有以下方法(以及更多方法)来简化其关系的遍历和操作:
Project#portfolio,Project#portfolio=(portfolio),Project#portfolio.nil?

该列表中的第三项显然只是提示
nil
是关系属性的有效值

(问题的答案是“否”,您不能在Ruby中定义一系列方法,只需一个
def

这只是Rails文档中的一个bug(或者,让我们称之为有点误导性的措辞)。引自:

project类现在有以下方法(以及更多方法)来简化其关系的遍历和操作:
Project#portfolio,Project#portfolio=(portfolio),Project#portfolio.nil?

该列表中的第三项显然只是提示
nil
是关系属性的有效值


(问题的答案是“否”,你不能在一个
def
中定义Ruby中的方法链)

我认为他的意思是文档将
Project\portfolio.nil?
列为一个单独的方法。这令人困惑。这怎么可能是一个方法名称?是:如前所述:portfolio.nil怎么可能?有一个方法名吗?我想他的意思是文档将
Project#portfolio.nil?
列为一个单独的方法。这令人困惑。这怎么可能是一个方法名称?是:如前所述:portfolio.nil怎么可能?是一个方法名吗?