ruby – 使用::访问模块方法
发布时间:2020-12-17 04:24:03 所属栏目:百科 来源:网络整理
导读:我读过的文档告诉我使用Module.method来访问模块中的方法.但是,我也可以使用Module :: method.这是语法糖,还是我困惑? module Cat FURRY_LEVEL = 4 def self.sound %w{meow purr hiss zzzz}.sample endendputs Cat.sound # This works.puts Cat::sound # Th
我读过的文档告诉我使用Module.method来访问模块中的方法.但是,我也可以使用Module :: method.这是语法糖,还是我困惑?
module Cat FURRY_LEVEL = 4 def self.sound %w{meow purr hiss zzzz}.sample end end puts Cat.sound # This works. puts Cat::sound # This also works. Why?! puts Cat.FURRY_LEVEL # Expected error occurs here. puts Cat::FURRY_LEVEL # This works. 解决方法
恒定分辨率始终要求您使用::.
方法调用是惯用的,通常是句点(.),但::也是合法的.这不仅适用于所谓的模块方法,而是适用于调用任何对象的任何方法: class Foo def bar puts "hi" end end Foo.new::bar #=> hi 它不是“语法糖”,因为它只是替代语法,例如能够使用换行符,然后换行符或者换行符来编写if或case语句. 它是特别允许的,因为Ruby允许使用与常量同名的方法,有时候认为它们是同一个项是有意义的: class Foo class Bar attr_accessor :x def initialize( x ) self.x = x end end def self.Bar( size ) Foo::Bar.new( size ) end end p Foo::Bar #=> Foo::Bar (the class) p Foo::Bar(42) #=> #<Foo::Bar:0x2d54fc0 @x=42> (instance result from method call) 您可以在Nokogiri库中的Ruby中看到这一点,它具有(例如) @doc = Nokogiri::XML( my_xml ) 您也可以在Sequel库中看到这一点,您可以在其中编写: class User < Sequel::Model # Simple class inheritance class User < Sequel::Model(DB[:regular_users]) # Set which table to use 同样,我们有一个method (Sequel.Model)与constant (Sequel::Model)相同.第二行也可以写成 class User < Sequel.Model(DB[:regular_users]) ……但它看起来并不那么好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |