介绍几种不常见的类定义方法:
1. Struct
Person=Struct.new(:name,:age,:sex)
p=Person.new("liyuchun")
puts p
Struct生成一个仅仅包含数据属性的类。但是你可以在这个类的基础上扩展:
Person=Struct.new(:name,:age,:sex)
class Person
def log
puts "log here"
end
end
ok,这样看上去并不是那么的cool,不是嘛。让我们稍微改一下:
class Person < Struct.new(:name,:age,:sex)
def log
puts "log here"
end
end
it seems better. "<" 只要求后面跟着任何返回一个class object的表达式即可。
2. Class.new
我们是怎么定义一个类的?
class A
end
a = A.new
追根溯源,A是一个Class类的对象,而a是A类的对象。既然A通过new方法可以生成a,那么是否可以Class也可以通过new方法生成A呢?of course.
A = Class.new do
def self.log
puts "log here"
end
def log
puts "log there"
end
end
a=A.new
A.log
a.log
By default,新生成的类会继承自Object。But,if I want to change? Still easy :
A = Class.new(String) do ... end
此时,A就是继承自String类。
3. instance_eval和class_eval
何以解忧?唯有看代码。
class MyClass
end
MyClass.class_eval do
def instance_method
puts "In an instance method"
end
end
obj = MyClass.new
obj.instance_method
然后
class MyClass
end
MyClass.instance_eval do
def class_method
puts "In a class method"
end
end
MyClass.class_method
class_eval生成的是实例方法,instance_eval生成的是类方法,何须多言啊,呵呵。
also,
animal = "cat"
"dog".instance_exec(animal) do |other|
puts "#{other} and #{self}"
end
Ruby 1.9 引进了一些变种. Object#instance_exec, Module#class_exec和Module#module_exec使用instance_exec,你可以将参数传入block。
ok,我们可以利用class_eval实现attr_accessor的功能了:
module Mod
def attr_reader1(*syms)
syms.each do |sym|
class_eval %{
def #{sym}
@#{sym}
end}
end
end
end
class A
extend Mod
attr_reader1 :name
def initialize
@name = "jinbin"
end
end
a=A.new
puts a.name
原来这里用的是include Mod,是不正确的。但是恰巧命名的函数为attr_reader,结果程序竟然也能运行通过,呵呵。ATTENTION!
这里使用了class_eval函数,出于对比,也用instance_eval来写了一个:
module Mod
def attr_reader(*syms)
syms.each do |sym|
instance_eval %{
def #{sym}
@#{sym}
end}
end
end
end
class A
extend Mod
attr_reader :name
@name = "jinbin"
def initialize
end
end
puts A.name
由于class_eval生成的是实例方法,instance_eval生成的是类方法,所以调用上有所区别,在代码中都有体现。此处可以细细深究一下,注意self的值。
分享到:
相关推荐
《Ruby Programming—向Ruby之父学程序设计(第2版)》这本书旨在帮助初学者,甚至是完全没有编程背景的读者,快速掌握Ruby语言的基础和高级概念。 首先,Ruby是一种动态类型语言,这意味着变量的类型在运行时自动...
Java的OOP体系严谨,类定义严格,而Ruby则更加灵活,允许动态地添加和修改类的方法。Ruby的块和闭包是其独特之处,它们提供了强大的控制流和数据处理能力,这是Java中匿名内部类和接口不能比拟的。 其次,Ruby的...
这部分是理解Ruby强大之处的关键。 3. **动态编程技巧**:通过具体示例展示如何利用Ruby的动态特性编写自修改程序,提升代码的灵活性和可扩展性。 4. **轻量级多任务**:介绍如何使用Fiber和Thread来实现并发编程...
所有Ruby对象都是类的实例,而类则是对象。你可以创建自定义类并定义方法、属性和继承结构。以下是一个简单的类示例: ```ruby class Person attr_accessor :name, :age def initialize(name, age) @name = ...
Ruby标准库提供了大量预先定义的模块和类,方便开发者在各种场景下快速开发。其中包括文件操作、网络通信、XML解析、日期和时间处理、数学运算等功能。例如,`File`类用于处理文件和目录,`Net::HTTP`用于HTTP通信,...
Ruby的类定义使用关键字"class",对象是类的实例,可以通过消息传递来调用方法。Ruby还引入了模块(module)作为命名空间管理和实现多重继承的手段。 Ruby的元编程能力是其独特之处。通过反射API,开发者可以在运行...
6. **元编程**:Ruby的动态特性允许你在运行时修改代码,这是其独特魅力之一。元编程让你能够编写更加灵活和强大的代码。 7. **标准库与Gem**:Ruby拥有丰富的标准库,同时社区还提供了无数的Gem(Ruby的库或模块)...
首先,Ruby的面向对象特性是其核心之一。在Ruby中,一切都是对象,包括基本数据类型如数字、字符串和布尔值。例如,当你在Ruby中写下"hello",它实际上是一个String对象,你可以调用方法在它上面操作,如`"hello"....
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法著称,尤其适合Web开发,其中Rails框架是其最著名的应用之一。API(Application Programming Interface)是软件开发者用来与操作系统、库或服务进行...
书中的章节会逐步引导你了解如何声明变量、数据类型(包括字符串、数字、数组和哈希)、控制流(如条件语句和循环)、函数定义以及类和对象的概念。此外,你还会学习到Ruby的模块系统,它是组织代码和实现命名空间的...
1. **方法定义与调用**:Ruby允许在运行时定义和修改方法,如`define_method`函数可以动态创建方法,而`send`或`__send__`则用于在运行时调用方法。 2. **类与模块操作**:Ruby的`Class.new`和`Module.new`可以用来...
Ruby的块(Block)和 Proc 对象是其独特功能之一。块是一段可以在函数或方法中传递的代码,通常由`do..end`或花括号`{}`包裹。Proc对象可以捕获一个块并存储起来,之后在需要时调用。Lambda也是类似的概念,但它们在...
- 元编程是Ruby的核心优势之一。 - 动态创建方法和属性。 - 使用评估(Evaluation)和反射(Reflection)技术。 - 扩展和覆盖内置行为。 6. **测试与调试** - Ruby提供了丰富的测试框架,如RSpec和Test::Unit等。 ...
Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...
与其他文档工具相比,Yard的一个显著优势在于它支持自定义域特定语言(DSL)的文档,这意味着你可以为你的特定项目或库定义自己的文档样式和结构。 Yard的另一个亮点是其模板系统。默认情况下,Yard会生成一套标准...
《Ruby之路》是关于Ruby编程语言的一本详细指南,作者旨在揭示“Ruby之道”,即如何在Ruby编程中运用有效的解决方案和技术。第二版于2006年10月由Addison-Wesley出版,它全面地涵盖了Ruby语言的核心概念、语法特性...
3. **函数与方法**:Ruby中的函数称为方法,可以定义全局方法或类方法。了解如何定义、调用和传递参数是学习Ruby的重要部分。 4. **面向对象编程**:Ruby是一种纯面向对象的语言,每个值都是一个对象,每种类型都是...
- **面向对象编程(OOP)**:详细解释Ruby中的类、对象、继承、封装、多态等OOP核心概念。 - **程序结构**:探讨模块、混合和命名空间,如何组织大型Ruby项目。 #### 第二部分:进阶技巧 - **元编程**:讲解Ruby的元...
类定义了对象的属性(或称为实例变量)和行为(或称为方法)。Ruby支持单继承,但通过模块,可以实现一种形式的多继承,即混入。模块可以包含方法和常量,可以通过`include`关键字将模块的方法引入到类中。 Ruby的...