Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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元编程和关键字自混淆_Ruby - Fatal编程技术网

ruby元编程和关键字自混淆

ruby元编程和关键字自混淆,ruby,Ruby,在阅读ruby中的一些自用代码时,仍然无法理解一些示例: class A def hi "hi" end def self.hello "hello" end end a=A.new a.hi A.hello 了解我可以使用以下更改实例方法定义: class << a def hi "hi from a <<" end end a.hi => "hi from a <<" [22]撬杆(主

在阅读ruby中的一些自用代码时,仍然无法理解一些示例:

class A
  def hi
    "hi"
  end
  def self.hello
    "hello"
  end
end
a=A.new
a.hi
A.hello
了解我可以使用以下更改实例方法定义:

class << a
    def hi
      "hi from a <<"
    end
end

a.hi => "hi from a <<"
[22]撬杆(主)> [23]撬杆(主)>A.f7 NoMethodError:类的未定义方法
f7'
from(pry):42:in
pry' [24]撬杆(主)>a.f7 NoMethodError:未定义的方法
f7'#
from(pry):43:in
pry' [25]撬杆(主)>A.f9 NoMethodError:类的未定义方法
f9'
from(pry):44:in
pry' [26]撬杆(主)>a.f9 NoMethodError:未定义的方法
f9'#
from(pry):45:in
pry'

<<ERROR3>> 
你能帮我指出这些错误到底是什么吗:参考mark

  • 请注意,我的问题是:
  • 在对象中定义self.method有意义吗?如果没有,为什么没有冲突/错误?如果它有意义,那么它对对象的self.method意味着什么

  • >,为什么f7不能同时使用A的类和对象调用

  • >,为什么f9不能同时使用A的类和对象调用

  • 还有一点需要讨论:

    我可以用.f2或.f3调用覆盖f1方法,但是如果我在instance_eval块中直接定义方法,它将无法实现相同的目标,这里的区别是什么

    A.f4
    
    A.f1
    
    A.f5
    
    A.f1
    
    A.f1仍然返回“f1”。我发现,如果使用def,那么该方法被定义并与本征类实例绑定,如果使用define_方法,那么该方法作为静态方法与类A绑定


    define_方法和def的用法有什么区别

    您在这里提出的问题实际上是关于类、方法和对象如何在Ruby中工作的基础知识

    你所做的只是
    class
    方法和
    instance
    方法之间的区别

    实例
    方法在最基本的意义上意味着只能从实例化对象的级别调用该方法

    这就是您在这里看到的语法

    class A
      def hi
        "hi"
      end
    end
    
    在这种情况下,方法
    hi
    是类
    A
    的实例方法,因此我们必须实例化一个对象来调用它。为避免混淆外壳a和外壳a,我将使用
    foo
    而不是
    a

    foo = A.new
    foo.hi
    
    现在我们刚刚创建了
    A
    实例
    foo,因此我们可以在foo上调用方法
    hi

    接下来我们有
    class
    方法,或者可以在类级别调用的方法。在Ruby中,有多种语法可以实现这一点,以下所有语法在语义上都是等价的

    class A
      self.hello
        "hello"
      end
    end
    
    class A
      A.hello
        "hello"
      end
    end
    
    class A
      class << self
        def hello
          "hello"
        end
      end
    end
    
    现在,如果我们实例化
    a

    b = A.new
    

    b上不存在方法
    bar
    ;它只存在于实例
    foo

    通读一遍谢谢你的详细回复。为了扩展我的问题,您知道错误1/2/3的答案吗?在错误1中,您尝试使用语法
    def self.hello
    在实例上定义一个类方法。您只能在实例上定义实例方法,这些方法将传播到特征类;一个与错误1中的相同;您正试图在实例上定义类方法。另一个问题是调用
    A.f9
    。f9被定义为
    a
    实例上的类方法(不允许);因此,即使为实例变量
    a
    正确定义了它,它也将驻留在
    a
    的本征类中,因此它将不可用于类
    a
    错误3与错误2非常相似,我猜我明白你的意思了,我明白了如何通过使用以下方法来访问特征类的实例方法和静态方法:1。元类f9.2。元类.f7。问题是我如何以及何时使用这种技术?达到什么目的?有使用案例吗?
    A.f4
    
    A.f1
    
    A.f5
    
    A.f1
    
    class A
      def hi
        "hi"
      end
    end
    
    foo = A.new
    foo.hi
    
    class A
      self.hello
        "hello"
      end
    end
    
    class A
      A.hello
        "hello"
      end
    end
    
    class A
      class << self
        def hello
          "hello"
        end
      end
    end
    
    class << foo
      def hi
        "hi from foo"
      end
    end 
    
    class << foo
      def bar
        "bar"
      end
    end
    
    b = A.new