今天把之前做的一个工具集成到我的一个工具框架中,结果遇到了问题。我的工具和框架都是用ruby写的,框架通过eval方法调用注册的工具。而我的工具中有一个对于Array的monkey patch。
class Array do
alias old_zip zip
def zip(another_array)
if another_array and another_array.size > size
(another_array.size-size).times{ self << nil }
end
old_zip(another_array)
end
end
我单独运行工具的时候,一切正常。但是,集成之后却报一个错:module Tools.Methods.Array 没有方法zip。
原来是我在一个自定义的module中调用的eval.而传入的string就是我的那个工具原文件,这样看来,monkey patch没有找到Array这样一个类。所以也就无法找到一个zip方法。
我把代码改成这样就好了:
Array.class_eval do
alias old_zip zip
def zip(another_array)
if another_array and another_array.size > size
(another_array.size-size).times{ self << nil }
end
old_zip(another_array)
end
end
分享到:
相关推荐
7. **eval**:`eval`函数可以接收一个字符串,然后将其当作Ruby代码执行,从而实现动态代码的执行。 8. **定义语法糖(Syntax Sugar)**:Ruby提供了许多语法糖,如`attr_accessor`,`class_eval`等,使得元编程...
当您制作 Ruby DSL 时,您通常必须在以下各项之间做出决定: # Use a block variable to access the MyConfig instance. # This gives you the benefit of having access to the outer "self" inside of the block...
- **元编程**:Ruby提供了`eval`、`define_method`等方法,允许在运行时修改或创建类和方法,增强了灵活性。 - **异常处理**:通过`begin..rescue..end`结构处理程序中的异常情况。 3. **Ruby-2.5系列的特性**:...
通过`class_eval`或`Module#define_method`等方法,可以在运行时动态创建或修改类和方法。这使得Ruby程序具有高度的可扩展性和自定义性。 在学习Ruby时,了解类和模块的概念至关重要。类是对象的蓝图,定义了一组...
Ruby还引入了模块(Module),用于封装方法和常量,提供命名空间和混合(Mix-in)功能,让代码组织更加有序。 Ruby的控制结构包括条件语句(如if、unless、case)、循环(如while、for、each)和流程控制(如break...
instance_eval方法 这个BasicObject#instance_eval有点类似JS中的bind方法,不同的时,bind是将this传入到对象中,而instance_eval则是将代码块(上下文探针Context Probe)传入到指定的对象中,一个是传对象,一个是...
`eval`函数可以执行字符串作为Ruby代码,`send`方法可以动态调用对象的方法,而`instance_eval`和`class_eval`则可以在特定上下文中执行代码,极大地增加了代码的灵活性。 在Ruby 2.5.1中,标准库也得到了增强,...
§12.3.3 使用eval方法 88 §12.3.4 性能 88 §12.4 Hook和回调方法 89 §12.4.1 什么是Hook 89 §12.4.2 Ruby中的Hook 89 §11.4.2 回调方法 90 §12.5 跟踪程序的运行 90 §12.5.1 set_trace_func 90 §12.5.2 ...
Ruby的`eval`函数可以执行字符串形式的代码,`instance_eval`和`class_eval`则可以在上下文中执行代码,这对于动态调整对象行为或者改变类结构非常有用。此外,Ruby的模块(Module)系统也是元编程的重要工具,模块...
- **For..in** - **Break, Redo, Next** 这些结构提供了不同的循环控制方式。 ```ruby (1..5).each do |i| if i == 3 next # 跳过当前循环 end puts i end ``` #### 七、方法 **7.1 运算符重定义** 可以...
7. **模块和混合**:模块用于组织代码,混合(mix-in)机制让类可以像继承一样吸收其他模块的方法。 8. **宝石(Gem)管理**:Ruby的包管理系统,用于安装和管理外部库,如`require`和`gemspec`的使用。 9. **测试...
- **12.3.3 使用eval方法** - **12.3.4 性能**:动态方法调用可能会影响程序性能。 **12.4 Hook和回调方法** - **12.4.1 什么是Hook** - **12.4.2 Ruby中的Hook** - **12.4.3 回调方法**:在特定事件发生时调用的...
模块还可以用来实现命名空间和混入(Mix-in)功能,通过`include`关键字将模块的方法引入到类中。 7. **异常处理**:Ruby提供了异常处理机制,使用`begin/rescue/else/ensure`块来捕获和处理运行时错误。 8. **...
- `instance_eval`方法允许执行Proc对象中的代码,就像这段代码是在当前对象的上下文中定义的一样。因此,Proc对象可以访问到当前对象的实例变量和方法。 - 当在方法签名中使用`&`操作符时,表示该方法期望接收一个...
例如,我们可以利用Ruby的`class_eval`或`Module#define_method`动态地定义方法,实现灵活的策略模式。同时,Ruby的模块(Module)可以作为混入(Mix-in)来复用代码,实现领域服务和领域行为的组织。 在实践中,...
ruby> file = open(“some_file”) ERR: (eval):1:in `open’: No such file or directory – some_file 一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求...
8. **模块**:模块在Ruby中用于组织代码,提供命名空间,实现类的多重继承(混合-in),以及通过`include`和`extend`关键字来分享行为。 9. **标准库**:Ruby的标准库包含许多实用的模块和类,如文件操作、网络通信...
书中讲解了`send`方法、`class_eval`和`instance_eval`,以及如何通过反射机制操作对象和类。 10. **标准库和Gem**:Ruby拥有丰富的标准库和第三方Gem,这些资源极大地扩展了Ruby的功能。书中会介绍一些常用库和...