Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.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/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 on rails 名称空间模块方法定义_Ruby On Rails_Ruby_Postgresql_Pg - Fatal编程技术网

Ruby on rails 名称空间模块方法定义

Ruby on rails 名称空间模块方法定义,ruby-on-rails,ruby,postgresql,pg,Ruby On Rails,Ruby,Postgresql,Pg,我在Ruby中偶然发现了这段代码: 我玩了一会儿,发现这个东西就像一个普通的模块类方法一样被使用,它被称为:PG.connect。事实上,我们可以说def self.connect args。。。结束后,它也会起同样的作用 因为self::whatever对我来说是第一个,我想知道self名称空间在这样的上下文中到底是什么,在这种情况下它的真正目的是什么。有人能帮忙解释一下吗?::是范围解析操作符。所以self::connect解析自连接。这意味着它相当于self.connect。您可以从这个精

我在Ruby中偶然发现了这段代码:

我玩了一会儿,发现这个东西就像一个普通的模块类方法一样被使用,它被称为:PG.connect。事实上,我们可以说def self.connect args。。。结束后,它也会起同样的作用

因为self::whatever对我来说是第一个,我想知道self名称空间在这样的上下文中到底是什么,在这种情况下它的真正目的是什么。有人能帮忙解释一下吗?

::是范围解析操作符。所以self::connect解析自连接。这意味着它相当于self.connect。您可以从这个精心设计的示例中看到它的工作原理:

class Foo; end

class Bar
  def Foo::baz
    "Hello World"
  end
end

puts Foo.baz # "Hello World"
当然,我们也可以使用def Foo.baz获得完全相同的结果

不鼓励在方法定义中使用双冒号,原因是:

不要使用::来定义类方法

# bad
class Foo
  def self::some_method
  end
end

# good
class Foo
  def self.some_method
  end
end
除了引用常量和构造函数之外,不建议使用它:

Use::仅用于引用常量这包括类和模块 和数组或Nokogiri::HTML之类的构造函数。不要使用::for 常规方法调用

::是范围解析运算符。所以self::connect解析自连接。这意味着它相当于self.connect。您可以从这个精心设计的示例中看到它的工作原理:

class Foo; end

class Bar
  def Foo::baz
    "Hello World"
  end
end

puts Foo.baz # "Hello World"
当然,我们也可以使用def Foo.baz获得完全相同的结果

不鼓励在方法定义中使用双冒号,原因是:

不要使用::来定义类方法

# bad
class Foo
  def self::some_method
  end
end

# good
class Foo
  def self.some_method
  end
end
除了引用常量和构造函数之外,不建议使用它:

Use::仅用于引用常量这包括类和模块 和数组或Nokogiri::HTML之类的构造函数。不要使用::for 常规方法调用

在某些情况下,在某种程度上等同于。。我将省略一个精确的定义,在哪些具体情况下,它是等效的,在什么程度上,因为我坦率地承认,我自己并不完全了解它,也没有很好的记录

下面是一个where::and的示例。表现不同:

模块Foo def自动控制杆 “方法” 终止 Bar=‘常数’ def self.Qux;终止 终止 富吧 =>“方法” Foo::Bar =>“常数” Foo::Bar =>“方法” 福曲 Foo::Qux NameError未初始化常量Foo::Qux Foo::Qux [注意:这不是一个完美的示例,因为这是关于事物的消息发送端,而您的示例是关于事物的方法定义端。我相信在方法定义端,它们是100%相同的,因为def从未定义常量,因此不存在歧义。]

所有的风格指南都极力反对这种用法,从强烈建议不要使用它的消息感知部分到完全禁止两种用法。造成这种情况的主要原因是,这两种方法在发送消息时的行为不同,这可能会导致混淆。对于继承链中向上的动态方法查找和继承链中向上的常量查找,如果不使用相同的运算符,则更容易解释它们之间的概念差异:首先静态,词汇上向外,然后动态

许多红宝石爱好者使用的典型风格是:

从不使用::对于单例方法定义,始终使用。。 始终使用::在文档中引用单例方法时,切勿使用。。 始终使用。对于文档中包含单例方法的消息发送的用法示例,请不要使用::。 从不使用::对于包含单例方法的消息发送,始终使用。。 最后两种方法有时会被软化,以允许返回模块或类的方法,并允许充当工厂的方法,例如通过类似于常量查找的消息发送调用的方法,例如Nokogiri::XML而不是Nokogiri.XML

删除::的这种用法是有原因的,但这主要是因为向后兼容的问题。

::在某些情况下,在某种程度上等同于。。我将省略一个精确的定义,在哪些具体情况下,它是等效的,在什么程度上,因为我坦率地承认,我自己并不完全了解它,也没有很好的记录

下面是一个where::and的示例。表现不同:

模块Foo def自动控制杆 “方法” 终止 Bar=‘常数’ def self.Qux;终止 终止 富吧 =>“方法” Foo::Bar =>“常数” Foo::Bar =>“方法” 福曲 Foo::Qux NameError未初始化常量Foo::Qux Foo::Qux [注意:这不是一个完美的示例,因为这是关于事物的消息发送端,而您的示例是关于事物的方法定义端。我相信在方法定义端,它们是100%相同的,因为def从未定义常量,因此不存在歧义。]

所有的风格指南都极力反对这种用法,从强烈建议不要使用它的消息感知部分到完全禁止两种用法。这个 造成这种情况的主要原因是,这两种方法在发送消息时的行为不同,这可能会导致混淆。对于继承链中向上的动态方法查找和继承链中向上的常量查找,如果不使用相同的运算符,则更容易解释它们之间的概念差异:首先静态,词汇上向外,然后动态

许多红宝石爱好者使用的典型风格是:

从不使用::对于单例方法定义,始终使用。。 始终使用::在文档中引用单例方法时,切勿使用。。 始终使用。对于文档中包含单例方法的消息发送的用法示例,请不要使用::。 从不使用::对于包含单例方法的消息发送,始终使用。。 最后两种方法有时会被软化,以允许返回模块或类的方法,并允许充当工厂的方法,例如通过类似于常量查找的消息发送调用的方法,例如Nokogiri::XML而不是Nokogiri.XML


有一种方法可以删除::,但这主要是因为向后兼容性问题。

它相当于def self.connect。当您将代码放入类/模块定义中时,它与任何其他Ruby代码一样运行。唯一真正的区别是自我的价值。正如您在下面看到的,self指向正在定义的类或模块。类Ghost self==Ghost=>true end module Mummy self==Mummy=>true endIt相当于def self.connect。当您将代码放入类/模块定义中时,它的运行方式与任何其他Ruby代码一样。唯一真正的区别是自我的价值。正如您在下面看到的,self指向正在定义的类或模块。类Ghost self==Ghost=>true-end模块Mummy-self==Mummy=>true-endSo-self::connect解析来自self的连接。这意味着它的等价物self.connect起了作用。所以我想,样式指南不鼓励这样做的全部原因是,我们可以从不同的类/模块中定义属于不同类/模块的方法,这会使代码变得一团糟,对吧?您也可以在不使用范围解析操作符的情况下这样做。其不受欢迎的原因可能只是可读性:这意味着我们正在解析一个常量,而不仅仅是将一条消息传递给一个接收者,这实际上就是正在发生的事情。这里的消息是define|u method:connect do |*args |。。。end和self是接收者。定义属于不同类/模块的方法通常被认为是坏OOP,因为它违反了封装。因此self::connect解决了self的连接问题。这意味着它的等价物self.connect起了作用。所以我想,样式指南不鼓励这样做的全部原因是,我们可以从不同的类/模块中定义属于不同类/模块的方法,这会使代码变得一团糟,对吧?您也可以在不使用范围解析操作符的情况下这样做。其不受欢迎的原因可能只是可读性:这意味着我们正在解析一个常量,而不仅仅是将一条消息传递给一个接收者,这实际上就是正在发生的事情。这里的消息是define|u method:connect do |*args |。。。end and self是接收者。定义属于不同类/模块的方法通常被认为是不好的OOP,因为它违反了封装。很好的例子,但@max在他的评论中非常明确:这里的消息是define_method:connect do |*args |。。。结束和自我是接受者。因此,如果def self::some_method*参数。。。end equals define|u method:某些|u method do |*args |。。。然后结束,这就像给self发送一条消息,在那里定义一个完全有意义的方法。很好的例子,但@max在他的评论中非常明确:这里的消息是define_method:connect do |*args |。。。结束和自我是接受者。因此,如果def self::some_method*参数。。。end equals define|u method:某些|u method do |*args |。。。最后,这就像给self发送一条消息,在那里定义一个完全有意义的方法。