我正在开发Rails应用程序,并希望了解何时使用self.for
。
以下是我想要完全理解的方法的代码。如果有可能,我希望有一个替代这个代码,这样可以使事情更清楚。
def self.for(facebook_id)
User.create_by_facebook_id(facebook_id)
end
答案 0 :(得分:10)
self 指的是当前对象。
在一个类中,self用于定义类级方法。
class Foo
def self.for(facebook_id)
User.create_by_facebook_id(facebook_id)
end
end
在类Foo中定义的类方法。它被调用:
Foo.for(facebook_id)
您可以谷歌获取课程方法以了解更多信息。
可能是Rails或插件/ gem的一部分期望某些类将具有“for”类方法。更多上下文在这方面会有所帮助。
该方法正在做什么
正如类方法所常见的那样,它正在创建一个类的实例。例如,ActiveRecord类有一个类方法“create”,它尝试创建已存储在数据库中的模型类的实例。因此,User.create将返回已存储在数据库中的User类的实例。
在您的示例代码中,它调用应用程序中User类提供的类方法“create_by_facebook_id”。
看起来“for”方法被用于信息隐藏,因为它所做的只是进行另一个方法调用(到User.create_by_facebook)
添加了:
顺便说一下,Ruby方法的默认返回值是最后一个语句的值。因此,您的示例方法将返回从提供的facebook_id新创建的用户实例。
答案 1 :(得分: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。”
答案 2 :(得分:0)
简答:自我总是指当前对象。因此,在一个实例方法中,self是实例,在类方法中,self是类,在类定义中(如在您的示例中),self是类......
有关课程方法和您发布的代码段的详细信息,请参阅Larry K的答案。
答案 3 :(得分:0)
如果该代码位于名为Foo
的类中,则替代方法可以是:
def Foo.for(facebook_id)
User.create_by_facebook_id(facebook_id)
end
如果您希望能够在多个类中使用某些通用的类级别方法,则必须在此上下文中使用 self
。您使用Module
将它们添加到self.
以限定它们(因为您不知道它们将成为其中一部分的实际类的名称),然后将该模块作为您的一部分包含在内类。