2010-03-25 75 views
3

我正在开发一个Rails应用程序,并想了解何时使用self.forRails:何时使用自我

这是我想完全理解的方法的代码。如果可能的话,我希望有一个替代这个代码,这样会让事情变得更加清晰。

def self.for(facebook_id) 
    User.create_by_facebook_id(facebook_id) 
end 
+0

这不是特定于Rails的,所以我将它标记为这样。 – 2010-03-25 04:00:31

回答

10

是指当前对象。

在一个类中,self用于定义类级方法。

class Foo 
    def self.for(facebook_id) 
    User.create_by_facebook_id(facebook_id) 
    end 
end 

在类Foo定义类方法。它被调用:

Foo.for(facebook_id) 

你可以谷歌的类方法来了解更多。

这可能是Rails的一部分或插件/创业板期望有些类将有一个类方法“for”更多的上下文将在这方面有所帮助。

什么方法做

正如类方法常见的,它要创建一个类的实例。例如,ActiveRecord类有一个类方法“create”,它尝试创建已存储在数据库中的模型类的实例。因此,User.create将返回已存储在数据库中的User类的一个实例。

在您的示例代码中,它正在调用应用程序中User类提供的类方法“create_by_facebook_id”。

貌似“为”正被用于信息,因为所有它做的是另一种制作方法调用(以User.create_by_facebook)

新增隐藏方法:

顺便说一句,默认返回值来自Ruby的方法是最后一条语句的值。所以你的示例方法将返回从提供的facebook_id新创建的用户实例。

0

它看起来像我self.for只是一个用于创建一个用户的Facebook ID的别名。我觉得其实self.for应该是:

def self.for(facebook_id) 
    User.find_or_create_by_facebook_id(facebook_id) 
end 

它搜索与Facebook的ID的用户,如果没有找到一个,创建一个记录并返回它的方式。然后,self.for的意思是“返回用户这个Facebook的ID”。

+0

这个答案与被问到的问题无关:在这段代码片断中,自我意味着什么...... – severin 2010-03-25 09:27:04

+0

不一定。他问自己,为什么,我回答。不需要让我失望,因为你以不同的方式解释他的问题。 – mjaz 2010-03-25 22:02:56

0

简短回答:自我总是指当前对象。所以在实例方法中,self是实例,在类方法中,self是类,并且在类定义内(如您的示例中),self是类...

有关类方法的更多信息和您发布的代码片段,请参阅Larry K.的答案。

0

如果代码是一个名为Foo类里面,那么可选的方案是:

def Foo.for(facebook_id) 
    User.create_by_facebook_id(facebook_id) 
end 

self在这种情况下是必要的,如果你有,你希望能够使用一些通用类级别的方法跨多个班级。您可以使用self.将它们添加到Module中以对它们进行范围(因为您不知道它们将要参与的实际类的名称),然后将该模块作为类的一部分。

相关问题