Ruby 中的 module_function 和 extend self异同(rubysmb error)居然可以这样

随心笔谈9个月前发布 admin
201 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章主要讨论了在Ruby语言中模块方法(module method)和类方法(class method)的区别及其调用方式。文章通过示例代码解释了模块方法和类方法的不同行为: 1. **模块方法**:可以被模块直接调用,但不能被类或实例调用。2. **类方法**:只能被类或实例调用。 文章还讨论了以下问题:- 私有方法在模块中是否可以被类或实例调用。- 包含模块的类实例能否调用模块方法。- 模块方法和私有方法的权限限制。 总结:文章通过示例代码展示了模块方法和类方法在调用上的区别,并探讨了模块方法的权限问题,帮助读者理解模块方法和类方法在Ruby中的行为和限制。


# test.rb
module MyModule
def public_meth
p “a public method, if the module is included to a class , can be call as object.public_meth”
end
def module_method
p “a module method,can be called as module_name.module_method. but can not be call as object.module_method”
end
private
def private_method_to_module_function
p “a private_method, but can be call as module_name.module_method, because it was assigned to module_function”
end
def private_method
p “I am a private method”
end
module_function :module_method, :private_method_to_module_function
end

MyModule.module_method
MyModule.private_method_to_module_function
begin
MyModule.public_meth
rescue
p “public method can not be called by module_name.public_meth”
end
begin
MyModule.private_method
rescue NoMethodError
p “private method can not be called by module_name.module_method”
end

class MyClass
include MyModule
end

obj=MyClass.new
obj.public_meth

begin
obj.private_method
rescue NoMethodError
p “private method in module can not be call by object.method_name”
end

begin
obj.module_method
rescue NoMethodError
p “module method can not be called by object.method_name, for object, module method is private instance method”
end

#调用
ruby test.rb
“a module method,can be called as module_name.module_method. but can not be call as object.module_method”
“a private_method, but can be call as module_name.module_method, because it was assigned to module_function”
“public method can not be called by module_name.public_meth”
“private method can not be called by module_name.module_method”
“a public method, if the module is included to a class , can be call as object.public_meth”
“private method in module can not be call by object.method_name”
“module method can not be called by object.method_name, for object, module method is private instance method”

© 版权声明

相关文章