“茴” 字的六种写法---l 类方法的七种定义方式

简介: “茴” 字的六种写法---l 类方法的七种定义方式

Class 是继承 Object,而 Object 是继承 BasicObject。

可以为特定的对象定义专属于这个对象的方法,名为单例方法。如:

str = 'singleton method'
class  << str
   def hello
      puts "I'm a singleton method"
   end
end
str.hello
>> I'm a singleton method

由于类 Class 继承于 Object ,所以 Class 本身也是对象。这样,我们可以把为类添加类方法,当作为对象 Class 添加单例方法。

class C
   class << C
      def singleton_method
        puts "I'm one of Class C's methods"
       end
    end
end
C.singleton_method
>>I'm one of Class C's methods

由于在类定义中,self 为类本身,因此,如果在类中定义类方法,可以用 self 替代类名,因此衍生出第二种定义类的方法:

class C
   class << self
      def singleton_method
          puts 'I am one of Class methods'
      end
   end
end

Martz 在设计 Ruby 的时候,把所有程序员设想为合格的程序员,因此,他要程序员为自己所写的代码负责,而不是通过提供受限的编程语言,保证程序员所写的代码质量。所以,由于上面的那种写法不太符合程序员的习惯,因此提供了以下简便一点的方法:

class C
   def C.class_method
       puts 'another way to define class methods'
   end
end

同样,使用self来替换类名得到第四种声明类方法的方法:

class C
   def self.class_method
        puts 'use self to replace class name'
   end
end

到此为止,其实类声明的方法就可以结束了。但是本则孔乙己(90s、00s 等没学过这篇文章的需要脑补一下了)的精神胜利法,我再提供另外两种。 因为以上声明类方法的方式中,有两种是可以放在类外部声明的,所以又有了另外两种声明类的方法(lol):

class C
end
class << C
    def singleton_method
        puts 'the fifth way to define class methods'
   end
end
def C.singletom_method
    puts 'the sixth way to define class methods'
end

综合以上,终于拼凑够了“回”字的六种写法。

除了定义类方法,我们可以用以下方法,把任何类变成单例类:

# Object本身也是类,(类又继承Object,能不这么虐人吗?)所以打开类Object,为Object添加单例方法:
class Object
   class << self
       self
   end
end

大神 why the lucky stiff 依据这个,为元编程创建了 Metaid 库:

class Object
    #将类变为单例类
   def metaclass; class << self; self; end; end
   #看上去是实例方法,其实是类方法
   def meta_eval &blk; metaclass.instance_eval &blk; end
   # 定义类方法
   def meta_def name, &blk
       mate_eval { define_method name, &blk } 
  end
  #定义类的实例方法
  def class_def name, &blk
      class_eval { define_method name, &blk } 
 end
end

引用上述库,定义类方法:

class C
end
C.meta_def class_method_name { #方法 }

如此说来,共有 7 种定义类的方法了。

相关文章
|
Shell 分布式数据库 Apache
Hbase常用shell操作
Hbase常用shell操作
919 1
|
9月前
|
测试技术
Fast网络速度测试工具
Fast是由Netflix提供的网络速度测试工具,可快速测量用户的下载、上传速度及延迟。其全球可用、无广告干扰,并支持多种设备。测试自动进行,结果以Mbps显示。此外,用户可通过“Show more info”查看上传速度和延迟(含缓冲膨胀)。Fast以其简单快捷的特点,帮助用户了解网络性能并解决潜在问题,是评估网速的理想选择。
1082 0
Fast网络速度测试工具
|
Java Apache Maven
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
1720 0
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
|
10月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
282 31
|
12月前
|
机器学习/深度学习 数据采集 人工智能
昇腾AI行业案例(七):基于 Conformer 和 Transformer 模型的中文语音识别
欢迎学习《基于 Conformer 和 Transformer 模型的中文语音识别》实验。本案例旨在帮助你深入了解如何运用深度学习模型搭建一个高效精准的语音识别系统,将中文语音信号转换成文字,并利用开源数据集对模型效果加以验证。
473 12
|
存储 人工智能 运维
AI-Native的路要怎么走?一群技术“老炮儿”指明了方向
上世纪70年代,沃兹尼亚克、乔布斯等人成立Homebrew Computer Club,推动个人电脑普及。如今,创原会承袭这一精神,由CNCF执行董事Priyanka Sharma等构建,聚焦云原生和AI技术,汇聚各行业技术骨干,探索前沿科技。2024年创原会年度峰会达成“全面拥抱AI-Native”共识,解决算力与存储瓶颈,推动AI原生应用开发,助力千行万业智能化转型,成为行业创新风向标。
270 8
|
机器学习/深度学习 数据挖掘 大数据
大数据时代的“淘金术”:Python数据分析+深度学习框架实战指南
在大数据时代,数据被视为新财富源泉,而从海量信息中提取价值成为企业竞争的核心。本文通过对比方式探讨如何运用Python数据分析与深度学习框架实现这一目标。Python凭借其强大的数据处理能力及丰富库支持,已成为数据科学家首选工具;而TensorFlow和PyTorch等深度学习框架则为复杂模型构建提供强有力的技术支撑。通过融合Python数据分析与深度学习技术,我们能在各领域中发掘数据的无限潜力。无论是商业分析还是医疗健康,掌握这些技能都将为企业和社会带来巨大价值。
481 6
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
319 1
|
Kubernetes 应用服务中间件 数据安全/隐私保护
yaml文件格式详解 及 k8s实战演示
yaml文件格式详解 及 k8s实战演示
|
缓存 NoSQL 关系型数据库
【Redis】 浅谈分布式架构
【Redis】 浅谈分布式架构