Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ELI5:为什么在类方法中调用类方法而不显式声明类本身?(Ruby/Rails)_Ruby On Rails_Ruby_Oop_Class Method - Fatal编程技术网

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
,就可以执行它。我不明白为什么会这样

例如,假设您有一个model
Food
类,其模式如下:

  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方法时,例如
    self.foo=“bar”
    ,这是必需的,因为Ruby需要知道您并不是在试图设置局部变量(正如
    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


谢谢@max!非常有用。
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