Ruby学习笔记之反射和元编程

33、Ruby元编程与反射:深入探索与实践 本博客深入探讨了 Ruby 中的元编程与反射技术,详细解析了 `method_missing` 的应用与局限,以及如何利用 `TraceCalls` 模块追踪方法执行。通过实例展示了反射在查看对象和类信息、动态调用方法中的应用,并比较了 `send`、`call` 和 `eval` 的性能差异。此外,还介绍了分布式 Ruby 和编组技术的基本概念。文章最后总结了元编程和反射的优劣势,并提供了实用的操作建议,帮助开发者更好地利用 Ruby 的高级特性提升代码灵活性和可维护性。 阅读详情

反射和元编程


匿名Class对象

如果把一个Class对象,赋值给一个常量,那么这个常量就是一个类名。因此在Ruby中每一个类都是一个Class常量对象。因此Object.class = Class

例子:

C = Class.new # A new class with no body, assigned to a constant

c = C.new # Create an instance of the class

c.class.to_s # => "C": constant name becomes class name

运行时信息


类型信息


注意:o是一个对象,c是一个类

1.o.class

2.c.superclass

3.o.instance_of? c#相当于o.class == c

4.o.is_a? c 或者 o.kind_of? 或者 c === o。c#测试o的父类或者类型是否为c,或者o的类型是否包含c

5.只要创建了模块或者类,接下来就可以用开放类或者模块来添加各种东西。

模块相关的信息

module A; end # Empty module

module B; include A; end; # Module B includes A

class C; include B; end; # Class C includes module B

C < B # => true: C includes B

B < A # => true: B includes A

C < A # => true

Fixnum < Integer # => true: all fixnums are integers

Integer <Comparable # => true: integers are comparable

Integer < Fixnum # => false: not all integers are fixnums

String < Numeric # => nil: strings are not numbers

A.ancestors # => [A]

B.ancestors # => [B, A]

C.ancestors # => [C, B, A, Object, Kernel]

String.ancestors # => [String, Enumerable, Comparable, Object, Kernel]

# Note: in Ruby 1.9 String is no longer Enumerable

C.include?(B) # => true

C.include?(A) # => true

B.include?(A) # => true

A.include?(A) # => false

A.include?(B) # => false

A.included_modules # => []

B.included_modules # => [A]

C.included_modules # => [B, A, Kernel]

extend

Object的extend可以自动把模块的实例方法变成单例方法

module Greeter; def hi; "hello"; end; end # A silly module

s = "string object"

s.extend(Greeter) # Add hi as a singleton method to s

s.hi # => "hello"

String.extend(Greeter) # Add hi as a class method of String

String.hi # => "hello"

动态创建模块

每一个模块都是一个Nodule类的一个实例。因此可以通过创建Module常量来创建模块。

M = Module.new

或者用new的块语法

Fed = Module.new do

def meth1

"hello"

end

def meth2

"bye"

end

end

动态创建类

C = Class.new

D = Class.new(C) {

include M

}

对象信息


object_id得到对象ID

属性


class Point

def initialize(x,y); @x,@y = x,y; end # Define instance variables

@@classvar = 1 # Define a class variable

ORIGIN = Point.new(0,0) # Define a constant

end

Point::ORIGIN.instance_variables # => ["@y", "@x"]

Point.class_variables # => ["@@classvar"]

Point.constants # => ["ORIGIN"]

动态添加属性

o = Object.new

o.instance_variable_set(:@x, 0) # Note required @ prefix

o.instance_variable_get(:@x) # => 0

o.instance_variable_defined?(:@x) # => true

Object.class_variable_set(:@@x, 1) # Private in Ruby 1.8

Object.class_variable_get(:@@x) # Private in Ruby 1.8

Object.class_variable_defined?(:@@x) # => true; Ruby 1.9 and later

Math.const_set(:EPI, Math::E*Math::PI)

Math.const_get(:EPI) # => 8.53973422267357

Math.const_defined? :EPI # => true

注意:这儿易受静态语言的影响,而认为这些变量或者常量是已经存在于类中的。事实上,在Ruby中,当变量或者常量在第一次出现时,会加入到类体中,动态添加的时候这种行为显得更加魔幻。但是由于一个属性必须有个访问方法,因此对于外界来说也是一种提示。

删除

o.instance_eval { remove_instance_variable :@x }

String.class_eval { remove_class_variable(:@@x) }

Math.send :remove_const, :EPI # Use send to invoke private method

注意:因为remove方法是私有的,因此只能用eval和send来包装调用

方法


o = "a string"

o.methods # => [ names of all public methods ]

o.public_methods # => the same thing

o.public_methods(false) # 不包含继承的公有方法

o.protected_methods # => []: there aren't any

o.private_methods # => array of all private methods

o.private_methods(false) # Exclude inherited private methods

def o.single; 1; end # Define a singleton method

o.singleton_methods # => ["single"] (or [:single] in 1.9)

在Module中定义的类方法

String.instance_methods == "s".public_methods # => true

String.instance_methods(false) == "s".public_methods(false) # => true

String.public_instance_methods == String.instance_methods # => true

String.protected_instance_methods # => []

String.private_instance_methods(false) # => ["initialize_copy", "initialize"]

Math.singleton_methods # => ["acos", "log10", "atan2", ... ]

参见: Method (相同)

测试特定方法

String.public_method_defined? :reverse # => true

String.protected_method_defined? :reverse # => false

String.private_method_defined? :initialize # => true

String.method_defined? :upcase! # => true

对于对象来说

o.respond_to? name 测试o是否有一个方法,另一个参数如果为true,那么也可以测试private方法

动态调用方法

1,得到一个method来调用

2,用send或者public_send来发送消息

3,类和方法都可以调用,谁调用就在谁上面执行方法

"hello".send :upcase # => "HELLO": invoke an instance method

Math.send(:sin, Math::PI/2) # => 1.0: invoke a class method

"hello".public_send :puts, "world" # raises NoMethodError

4,模块也可以调用这个方法

def define_methods

shared = 0

Kernel.send :define_method, :counter do

shared

end

Kernel.send :define_method, :inc do |x|

shared += x

end

end

动态添加方法


1.添加实例方法

def add_method(c, m, &b)

c.class_eval {

define_method(m, &b)

}

end

add_method(String, :greet) { "Hello, " + self }

"world".greet # => "Hello, world"

注意的define_method是kernel的私有的方法,因此要用class_eval来包装他的调用

2.添加类方法

String.define_singleton_method(:greet) {|name| "Hello, " + name }

动态定义中的实例属性

在Ruby中,一个类调用instance_eval和define_method都是为了创建实例方法(这两个方法都是由高层类和模块调用的,因此类和对象中都会有这两个方法)。既然是实例方法,那么就会调用实例属性和实例方法。这在Java中是不可思议的,因为Java中所有的类方法都不可以调用实例方法。但是在Ruby中这些方法仅仅会把得到的块传递给类,而并不会检测其中的内容,也不会在类定义期间执行,因此不用担心是否会有实例属性未初始化的情况。这种做法就像C语言中的宏替换。

重命名方法

def backup(c, m, prefix="original")

n = :"#{prefix}_#{m}" # Compute the alias

c.class_eval { # Because alias_method is private

alias_method n, m # Make n an alias for m

}

end

鉴于这些方法都是Module中的私有方法,因此必须用class_eval来包装调用

动态删除

remove_method和undef_method

它们的不同之处是:undef_method会删除继承的方法,也就是说删除之后就没有了这个方法;remove_method仅仅删除子类的定义,父类的方法大这是被继承。

改变可见性

1.可以简单的用开类来实现

String.class_eval { private :reverse }

2.Module中的方法

禁止动态变化

一个类要想禁止动态变化,可以简单的调用freeze方法冻结

eval


eval "x + 1" # => 2

1.eval可以执行任何有效的Ruby语句,这样甚至可以用生成String的方式来处理代码

2.eval好用,但是容易滥用,因此要注意用其他的特性来代替它

3.eval可能不安全

Binding类

每一个的属性都一个特定的上下文,一般而言是一个对象。这样的状态用Binding对象来表示。Kernel.binding可以得到一个Binding对象(注意这个方法是私有的,因此要想办法变成共有)。接下来就可以用eval来的得到属性的值。

class Object

def bindings

binding # This is the predefined Kernel method

end

end

class Test

def initialize(x); @x = x; end

end

t = Test.new(10)

eval("@x", t.bindings) # => 10

或者在Ruby1.9中。

t.bindings.eval("@a")

instance_eval和class_eval

1.instance_eval和class_eval是在特定的类和对象上执行代码

o.instance_eval("@x") # Return the value of o's instance variable @x

String.class_eval("def len; size; end")

String.class_eval("alias len size")

String.instance_eval("def empty; ''; end")

另外可以用快语法

o.instance_eval { @x }

String.class_eval {

def len

size

end

}

String.class_eval { alias len size }

String.instance_eval { def empty; ""; end }

2.要注意的是instance_eval定义在BasicObject中,而Module中定义了class_eval,同时不是每一对象都是一个Module类实例,而每一个Class都是一个Module(Class->Module->Object)。因此在对象上只能调用instance_eval,而类上可以调用instance_eval和class_eval,当使用这种方法定义方法是,差别是instance_eval定义了一个单例方法(即使没有用前缀),这意味着对类来说,定义了一个类方法,对对象来说定义了一个对象的特有方法。另一方面,class_eval定义了实例方法,这对于对象也无意义。

触发方法


触发方法:也叫钩子,是在模块,类或者对象在被执行一个操作时触发的方法。他门大部分的名字以ed结尾并且都是单例方法。另外,这些方法的执行时机是在创建对象时执行。

inherited

def Object.inherited(c)

puts "class #{c} < #{self}"

end

其中inherited方法在父类中,它的参数c是子类。

included

module Final # A class that includes Final can't be subclassed

def self.included(c) # When included in class c

c.instance_eval do # Define a class method of c

def inherited(sub) # To detect subclasses

raise Exception, # And abort with an exception

"Attempt to create subclass #{sub} of Final class #{self}"

end

end

end

end

extended

实例方法


method_added

def String.method_added(name)

puts "New instance method #{name} added to String"

end

这个方法可以定义在任何模块或者类上,用于在类中添加实例方法时调用。

method_removed

method_undefined

单例方法


如果在定义的时候是类方法,那么就是在类方法被加入时被调用。反之,如果是实例方法,那么就是在对象加入单例方法时被调用。

singleton_method_removed

singleton_method_undefined

singleton_method_added

Module.const_missing

const_missing是一个类方法,用来在常量得不到的情况下处理。

例如:

module Unicode

def self.const_missing(name)

if name.to_s =~ /^U([0-9a-fA-F]{4,5}|10[0-9a-fA-F]{4})$/

codepoint = $1.to_i(16)

utf8 = [codepoint].pack("U")

utf8.freeze

const_set(name, utf8)

else

raise NameError, "Uninitialized constant: Unicode::#{name}"

end

end

end

这种情况下,当在常量不存在的情况下或用const_set来在产生一个常量。这种方法叫做延迟初始化。

BasicObject.method_messing

def method_missing(*args, &block)

m = args.shift

begin

arglist = args.map {|a| a.inspect}.join(', ')

@trace << "Invoking: #{@n}.#{m}(#{arglist}) at #{caller[0]}\n"

r = @o.send m, *args, &block

@trace << "Returning: #{r.inspect} from #{@n}.#{m} to #{caller[0]}\n"

r

rescue Exception => e

@trace << "Raising: #{e.class}:#{e} from #{@n}.#{m}\n"

raise

end

end

1.method_missing是一个实例方法

2.method_missing的第一个参数中的第一个元素是方法名,其他的都是传递给方法的参数。第二个参数是块。

3.这个实现跟踪方法调用。

虚拟机


ObjectSpace


each_object

ObjectSpace.each_object(Class) {|c| puts c }

可以看到这个方法的第一个方法指定类型,第二个块用来处理对象

_id2ref

这个方法和Object.object_id相反,通过一个对象地址来得到对象

define_finalizer

这个方法向一个对象注册一个在垃圾收集时执行的块。undefine_finalizer则删掉所有的块。

include ObjectSpace

a = "A"

b = "B"

c = "C"

define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" })

define_finalizer(a, proc {|id| puts "Finalizer two on #{id}" })

define_finalizer(b, proc {|id| puts "Finalizer three on #{id}" })

garbage_collect

强制垃圾收集

弱引用对象

# foo = Object.new

# foo = Object.new

# p foo.to_s # original's class

# foo = WeakRef.new(foo)

# p foo.to_s # should be same class

# ObjectSpace.garbage_collect

# p foo.to_s # should raise exception (recycled)

GC


enable

disable

start

空白类

在Ruby1.9中的提供了一个空白类中仅仅提供了非常少量的方法,这样在幽灵方法中和动态定义方法中就可以避免名称的冲突。

DSL

Ruby编程中的作用域和元编程 Ruby中有四种不同的作用域:顶级作用域、类作用域、模块作用域和方法作用域。顶级作用域是程序的最外层作用域,其中定义的变量在整个程序中都可见。Ruby中有四种不同的作用域:顶级作用域、类作用域、模块作用域和方法作用域。作用域是编程中一个重要的概念,它定义了变量在程序中的可见性和访问性。在本文中,我们将深入探讨Ruby中的作用域和元编程,并提供相应的源代码示例。作用域是编程中一个重要的概念,它定义了变量在程序中的可见性和访问性。在本文中,我们将深入探讨Ruby中的作用域和元编程,并提供相应的源代码示例。 阅读详情

相关推荐

36、Ruby元编程与反射机制深度解析

本文深入解析了Ruby中的元编程与反射机制,探讨了如何利用这些特性提升代码的灵活性和功能。内容涵盖了method_missing的过滤器应用、TraceCalls模块的追踪实现、顶级执行环境的对象本质、反射对程序自省的支持、以及动态调用方法的不同方式及其性能比较。同时,还介绍了反射在插件系统、数据序列化和测试框架等场景中的实际应用,并提醒开发者注意代码可读性、性能开销和安全性问题。通过本文,读者可以全面了解Ruby元编程和反射的强大能力,并在实际项目中合理运用。

Pepper的专栏 55

Ruby中的语言特性—反射技术

java与c#等高级语语言都支持反射技术,Ruby也不例外。学习一种语言必须了解它的一些特性,在上一篇《开发软件常用到的几个最基本技能(RUBY 语言描述)。》中也简单地提到Ruby的一些语言物性,在这里想单独说明一下Ruby中的常用的一些技巧。而反射技术在其它多种与言中也是广泛地使用的。因此在这里先说明Ruby中如何利用反射技术。反射主要是用于动态地调用一些例实例或类型的方法。在java与C#等

民工 4376

33、Ruby 反射与元编程技巧深度解析

本文深入解析了 Ruby 中的反射与元编程技巧,包括过滤对象方法、获取方法引用、修复他人类中的 bug、监听类的变化、检查对象属性以及响应未定义方法的调用等核心技术。通过代码示例和实际应用场景,全面展示了如何在运行时动态修改和扩展程序行为,帮助开发者提升代码灵活性和功能实现能力。同时提醒开发者谨慎使用这些高级特性,以避免潜在的复杂性和 bug 风险。

aa123的博客 57

ruby 反射

反射主要是用于动态地调用一些例实例或类型的方法。在java与C#等静态语言中是十分普遍的。以下先看一下最简单的例子: obj="Hello World" puts obj.methods #输入对象可以使用的方法 puts obj.class #输入对像的类型 puts obj.class.superclass #输入对象的父类 第一行创建了一个字符串对象,但我们刚接触Ruby...

晗的IT生活 281

Ruby元编程:创建与反思

本章深入探讨了Ruby中的元编程技术,包括metaprogramming的概念、如何通过反射来分析程序、动态方法的调用以及如何使用ObjectSpace来管理对象空间。文章通过实例演示了如何利用method_missing来拦截方法调用,以及如何通过TraceCalls模块追踪方法执行。此外,还介绍了Ruby的垃圾回收机制以及如何在Ruby中使用反射技术来获取对象和类的相关信息。

weixin_42527665的博客 380

Ruby元编程与反射技术的实践与探索

本文深入探讨了Ruby语言中的元编程和反射技术。元编程技术允许开发者在运行时动态地定义和修改对象和类的行为,而反射技术则允许程序在运行时检查和操作自己的内部结构。通过结合实际案例,本文展示了如何通过元编程优化性能、定义方法、以及如何利用反射技术遍历对象空间、探索对象和类的内部结构。

weixin_42589700的博客 330

Ruby 101:动态编程

Ruby 101:动态编程  Written by Allen Lee  当method_missing的魔法失效时……       在上一篇文章里,我们通过重写Hash类的method_missing方法把Hash对象模拟成匿名对象,但是,这种做法有时会产生一些莫名其妙的问题,举个例子吧,假如我把process方法(完整实现参见上一篇文章的代码31)的option

Allen Lee's Magic 1506

别再手动配电脑了!手把手教你用Windows Server 2022搭建企业AD域(附DNS配置避坑指南)

本文详细介绍了如何使用Windows Server 2022搭建企业AD域,提升20+终端的管理效率。通过实战案例和避坑指南,解析AD域的核心价值、部署步骤及DNS配置技巧,帮助企业实现集中权限管理、安全策略统一部署,显著降低IT运维成本。

weixin_30652897的博客 349

ruby 闭包

<br />闭包 closure  就是将代码以参数的形式传递过去  ,比较方便使用<br /> <br />ruby的反射就是通过对象 找到他的父亲  祖宗是八代<br />  .class即可

思想的苇草 693

通用策略04丨ORB魔改框架+自适应动量过滤模板

1、该策略第一次尝试使用低通滤波器进行行情择时过滤,同样该方法也可以用于主进场逻辑。2、出场逻辑适用于趋势、隔日波段、高低开等行情结构,对于日线级别长度K线一定积极作用,因此大家可以根据该逻辑进行反向品种筛选。3、在资金管理方面,我注意到一个问题,以往都是按照复权价格计算,但是资金却没有复权,所以这里实际上这里应该将价格除权计算,如下图所示:由于各平台差异,回测绩效以TBQ版本为准!!!本策略仅作学习、交流使用,实盘交易盈亏投资者个人负责!!!

松鼠宽客的博客 1176

立创星火计划:基于STM32H743VIH6的Maverick_H743_MK1.0高性能开源飞控硬件全解析

本文详细解析了基于STM32H743VIH6核心的Maverick_H743_MK1.0高性能开源飞控硬件设计。重点阐述了采用双IMU冗余设计、高精度气压计、多路独立电源管理以及丰富接口(如CAN总线)的考量,旨在为穿越机、科研无人机等平台提供强大、可靠的飞行控制解决方案。

weixin_28787801的博客 198

ruby 反射

第二十六章 反射, ObjectSpace, 和分布式Ruby(3-1) 动态语言如Ruby的众多优点的一个是可以内省—从程序本身的内部检查程序的状况。Java中称这个特征为反射,但Ruby的能力要远远超出Java。 单词“反射”请求在镜像中查看自己—perhaps investigating the relentless spread of that bald...

weixin_34292402的博客 274

实战避坑:在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时,必须搞清的P2P DMA与IOMMU那些事

本文深入探讨在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时P2P DMA与IOMMU的关键问题,解析PCIe架构中的地址转换、P2P DMA与标准DMA的区别,以及IOMMU对性能的影响。通过实战案例和调优建议,帮助用户避免常见配置陷阱,提升AI训练集群的数据传输效率。

weixin_33720078的博客 444

Ruby中的元编程技术有哪些应用场景?

通过利用反射、动态方法调用、方法缺失、元类和别名方法等技术,开发者可以在运行时动态地改变程序的行为和结构,实现各种复杂和灵活的功能。元编程,即编写编写代码的代码,使得Ruby开发者能够动态地改变程序的行为和结构,从而创造出高度可定制和可扩展的应用程序。Ruby中的元编程技术主要包括反射(Reflection)、动态方法调用、方法缺失(Method Missing)、元类(Metaclass)、别名方法(Alias Method)等。这些API和框架能够适应不同的需求和场景,提供强大的功能和灵活性。

Samanthaasefield的博客 1426

手把手教你用闲置安卓手机搭建个人收款系统(蓝鲸支付私有化部署实战)

本文详细介绍了如何利用闲置安卓手机搭建个人收款系统,实现私有化支付部署。通过开源技术栈和容器化方案,零成本构建安全、高效的支付网关,解决传统支付平台的数据安全和资金风险问题。特别适合个人开发者和小微企业主,无需复杂审批,资金实时到账,显著降低运营成本。

weixin_30363285的博客 380

有限状态机FSM详解(一)

有限状态机在维基百科中的解释是: 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 至于为什么要学FSM,FSM可以把模型的多状态、多状态间的转换条件解耦。可以使维护变得容易,代码也更加具有可读性,也更加艺术。 理解有限状态机首先需要理解整个模型。我们把灯的开关作为示例,...

benjonc的博客 5万+

反射和元编程

Mat、Jon 和 Jaana 讨论了反射和元编程。其他语言如何使用反射?这与 Go 的方法有何不同?哪些库很好地使用了反射?哪些情况不适合使用反射?有哪些替代方法?我在 Go 代码中一直看到的那些奇怪的结构标记是什么? 本篇内容是根据2020年5月份#133 Reflection and meta programming音频录制内容的整理与翻译 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. Mat Ryer: 大家好,欢迎来到 Go Time。今天我们将讨论反射(reflection),以

techdashen的博客 910

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

Ruby元编程有哪些实际应用?

Ruby的元编程能力为开发者提供了极大的灵活性和动态性,使得他们能够构建出高效、可扩展且易于维护的系统。从DSL的创建到代码生成与模板化,再到动态类型与反射以及AOP的实现,Ruby的元编程在实际应用中发挥着重要作用。元编程(Metaprogramming)是计算机科学中的一个重要概念,它指的是编写能够处理代码本身(如生成、修改或操作代码)的程序。例如,使用Ruby的Mock和Stub库(如RSpec的mocks和stubs),开发者可以模拟对象的行为并验证它们之间的交互。五、元编程在测试中的应用。

AntonioMargery的博客 794

第二节_PySide6项目创建流程介绍、手把手教学打包EXE可执行文件

本文详细介绍了如何使用PySide6创建一个带UI界面的Python程序,并将其打包成exe可执行文件。首先,通过Pycharm创建项目,并使用PySide6-Designer工具设计UI界面,将生成的ui文件转换为Python代码。接着,编写主程序,加载UI界面并实现功能,如加载图片、设置图标等。最后,通过资源文件管理图片资源,并确保UI界面的更新能同步到主程序中。整个过程涵盖了项目创建、UI设计、代码编写及资源管理,适合初学者学习如何将Python程序打包为可执行文件。

su桥木的博客 2557

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Ruby元编程在框架开发中的应用

在软件开发的世界中,元编程是一个强大的概念,它允许程序员编写能够操作代码本身的代码。在框架开发中,Ruby的元编程特性发挥了至关重要的作用,使得开发者能够构建出更加灵活、可扩展和易于维护的框架。Ruby的元编程特性为框架开发提供了强大的支持,使得开发者能够构建出更加灵活、可扩展和易于维护的框架。此外,Ruby的元编程还支持插件之间的依赖管理和冲突解决,确保了框架的稳定性和可靠性。通过元编程,框架可以为开发者提供一系列的钩子点,这些钩子点允许开发者在框架的特定阶段插入自己的代码。一、Ruby元编程概述。

AdolphMacDonald的博客 786

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【编程导航】Ruby元编程(基础篇)

这几天将《Ruby元编程》这本书的基础部分做了学习与总结,将每一章的重点知识与代码都写在了上去,可以做到快速的回顾。本篇文章内容较长,主要适用于已掌握Ruby基本语法的同学,从模型底层的角度进行分析对象之间的关系,与一些实践操作的技巧。 本篇分为五个章节: 1. 对象模型 2. 方法 3. 代码块 4. 类定义 5. 编写代码的代码

weixin_55166254的博客 1141

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Ruby中的元编程技术如何简化代码逻辑

展望未来,随着编程技术的不断发展和创新,我们相信Ruby的元编程技术将会得到更广泛的应用和拓展。同时,我们也期待更多的开发者能够深入学习和掌握这些技术,为构建更加高效、灵活和健壮的Ruby应用程序贡献自己的力量。通过别名方法(Alias Method),我们可以简化方法调用的复杂性,提高代码的可读性。例如,如果一个方法的名字过长或者不够直观,我们可以为其定义一个简短的别名,使得调用更加便捷。Ruby中的每个对象都有一个与之关联的元类(Metaclass),它负责定义对象的类方法和单例方法。

ElvaRaleign的博客 584

Ruby元编程

现在关于Ruby元编程可以说比较热门,这个隐藏在Ruby背后的特性随着大家对Ruby的了解逐渐显现出来啦。这篇文章是自己对Ruby MetPrgamming的理解。 元编程中的元是指元信息(Meta),主要是为其载体提供基本信息,如html页面中就有meta,如content type说明,SEO等。在C++,Java和Ruby语言中,也有元信息概念,如加载到内存中(运行期)的当个对象模型(

晗的专栏 3201

Ruby元编程技术如何应用,提高代码灵活性?

通过不断学习和实践,我们可以充分利用Ruby的元编程技术,提高代码的灵活性,并创造出更加优秀的软件产品。在编程的世界里,元编程是一种强大的技术,它允许程序员在编写代码时,对代码本身进行操作。Ruby,作为一种动态类型、面向对象的编程语言,提供了丰富的元编程特性,使得开发者能够编写出高度灵活的代码。在Ruby中,元编程主要涉及到反射、动态方法调用、方法缺失处理、别名方法、钩子方法、元类等技术。来自:www.zhichengkeji.com.cn。来自:www.zhongmeijianshe.cn。

Emmanueloldsmith的博客 596
上一篇: Ruby学习笔记之面向对象
下一篇: Scala学习笔记之Scala特性
ssjssh
博客等级 码龄15年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值