Ruby on rails ELI5:为什么在类方法中调用类方法而不显式声明类本身?(Ruby/Rails)
对不起,这个标题有点让人困惑,但我刚刚发现了一件让人难以置信的事情。当您在类方法中调用类方法时,不必在它前面放置一个Ruby on rails ELI5:为什么在类方法中调用类方法而不显式声明类本身?(Ruby/Rails),ruby-on-rails,ruby,oop,class-method,Ruby On Rails,Ruby,Oop,Class Method,对不起,这个标题有点让人困惑,但我刚刚发现了一件让人难以置信的事情。当您在类方法中调用类方法时,不必在它前面放置一个self,就可以执行它。我不明白为什么会这样 例如,假设您有一个modelFood类,其模式如下: create_table "foods", force: :cascade do |t| t.string "name", null: false t.string "food_type",
self
,就可以执行它。我不明白为什么会这样
例如,假设您有一个modelFood
类,其模式如下:
create_table "foods", force: :cascade do |t|
t.string "name", null: false
t.string "food_type", null: false
t.datetime "expiration_date", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
class Food < ApplicationRecord
def self.output_new
new(name: 'marshmallow', food_type: 'snack')
end
end
create_table“foods”,force::cascade do | t |
t、 字符串“name”,null:false
t、 字符串“食物类型”,null:false
t、 datetime“到期日”,null:false
t、 datetime“created_at”,精度:6,空值:false
t、 日期时间“更新时间”,精度:6,空值:false
结束
类别食品<申请记录
def self.output_new
新增(名称:“棉花糖”,食品类型:“零食”)
结束
结束
只需编写new
返回一个新创建的实例,而不是编写Food.new
或self.new
。使用特征类语法编写方法也会产生相同的结果。这不仅限于new
,它还适用于几乎所有适用的类方法,如create、delete、instance\u方法
,等等
我已经研究过为什么会这样,但我真的不明白。有人能解释一下为什么会发生这样的事情以确保我没有产生幻觉吗
谢谢大家! 无论何时调用一个方法,Ruby都会首先检查它是否在
self
上定义。据我所知,只有一个例外-如果您有一个与方法同名的局部变量,它将引用该局部变量:
def num; 1; end
num = 2
num # => 2
在这方面,类方法与实例方法相同
更容易想到你不能忽略自我的情况:
- 当使用setter方法时,例如
,这是必需的,因为Ruby需要知道您并不是在试图设置局部变量(正如self.foo=“bar”
所做的那样):foo=“bar”
- 当局部变量和方法(两者名称相同)之间存在歧义且您希望调用该方法时:
class Foo def self.a; 1; end def self.b a = 2 a # references local variable self.a # calls method a() # can also call the method by writing out parens (removes ambiguity) end end
- 当
不是您想要的范围时self
class Foo def self; a; 1 end a # obviously doesn't work, it isn't defined here Foo.a # works
- 当方法名称与保留字相同时(例如
)class
class Foo
def self; a; 1
end
a # obviously doesn't work, it isn't defined here
Foo.a # works
def class_name
class.name # syntax error, it thinks you want to define a class
self.class.name # works
end