`
dadadada2x
  • 浏览: 9659 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

ruby class_eval instance_eval instance_exec

 
阅读更多
之前对这两个的用法很混淆,现在自己有仔细的思考了一下,写下来欢迎大家来探讨,给予指正。
    class_eval instance_eval 它们都继承了eval也就是Ruby的evaluation。因为class就是module的扩展,所以class_eval和module_eval我认为是一回事,class_eval是module_eval的alias。
我在这里就区分一下class_eval和instance_eval这两个让我困惑了好长时间的方法。
1.class_eval
首先它是作用在类上面的
class A
end
A.class_eval后面可以跟字符串或者block
字符串 A.class_evala(%q{def hello() "Hello word!" end})
block A.class_eval{}
我原来一直以为它是给一个类添加类方法,这是不对的,它的作用是打开一个类,给这个类添加方法(实例方法),注意添加的是实力方法。因为并没有在hello方法前加self将它变成类方法,所以他就会是实例方法。
2.instance_eval
这个使用起来很灵活,首先它是作用在实例上面的方法,我们定义的类比如
class A
@a=1
end
,其实都是class的实例,可以通过A.instance_eval{@a}来访问,或者
class B
  def initialize 
    @b= 2 
  end 
end 
 
b = B.new 
b.instance_eval { @b} #2,
如果想通过类访问它的实力变量可以这样
class A
class << self 
  attr_accessor :i
end
@i=1
end
A.i = 4 #4
A.i #4

总结一下,class_eval主要是对类做一些事情,它的职责是打开类。对类增加方法或者是include一个module等。而instance_eval关注的则是一个实例,像这样
class A
end
A.instance_eval do
  def c
  end
end
因为A本身就是class的实例,所以可以调用A.c,具体的说就是给class的实例增加一个方法,就是给A增加一个类方法。也就是说其实类方法就是class的实例类的方法。

还有instance_exec其实就是带参数的instance_eval

最后我也上个图

  • 大小: 29.9 KB
分享到:
评论

相关推荐

    Ruby Meta Programming: define_method or class_eval

    `define_method`和`class_eval`是Ruby元编程中的两个关键方法,它们被广泛用于动态地添加方法到类或者模块中。这篇文章将深入探讨这两个方法的用法和区别。 `define_method`方法允许我们传递一个符号和一个代码块来...

    详解Ruby中的instance_eval方法及其与class_eval的对比

    ### Ruby中的instance_eval方法及其与class_eval的对比 #### 一、instance_eval方法详解 **instance_eval** 方法属于Ruby语言中的eval家族成员之一,它的主要功能是将一个代码块(通常是一个包含Ruby代码的字符串...

    trec_eval_latest.tar

    本文将深入探讨名为“trec_eval_latest.tar”的压缩包文件,它包含了trec_eval的最新版本——trec_eval.9.0。 trec_eval是TREC官方提供的一个开源命令行工具,主要用于分析和比较信息检索系统的评价指标。该工具...

    reset_jetbrains_eval_windows.rar

    标题 "reset_jetbrains_eval_windows.rar" 暗示这是一个针对JetBrains开发的IDE在Windows操作系统上的试用重置工具。JetBrains是一家知名软件开发公司,以其高效、功能强大的集成开发环境(IDE)如IntelliJ IDEA、...

    I2C.zip_STM3210E_STM32F10X.h_stm32_eval.h_stm32_eval_i2c__stm32f

    #include "stm32_eval_i2c_tsensor.h" #include "stm32_eval.h" #ifdef USE_STM32100E_EVAL #include "stm32100e_eval_lcd.h" #elif defined USE_STM3210E_EVAL #include "stm3210e_eval_lcd.h" #elif defined ...

    GD32F450I_EVAL官方评估板 _LittlevGL代码移植

    在本文中,我们将深入探讨如何将LittlevGL图形库移植到GD32F450I_EVAL官方评估板上。...在GD32F450I_EVAL_LittlevGL压缩包文件中,应包含移植所需的所有源代码、配置文件和示例,帮助开发者顺利进行移植工作。

    license_eval_halcon_progress_2022_03.dat

    license_eval_halcon_progress_2022_03.dat

    STM3210C_EVAL_stm32_STM3210C_EVAL_temperature565_

    在给定的标题"STM3210C_EVAL_stm32_STM3210C_EVAL_temperature565_"中,我们可以推测这是与STM3210C EVAL板相关的项目或者固件更新,可能包含了针对STM3210C处理器的温度测量或控制功能。"temperature565"可能指的是...

    j4locr_eval

    标题“j4locr_eval”指向的是一个与Java开发相关的技术或库,特别是与图像处理或者文本识别有关,因为“j4locr”通常与OCR(Optical Character Recognition,光学字符识别)技术关联。这个“eval”可能表示这是评估...

    reset_jetbrains_eval_windows.vbs

    可以无限重置

    CrystalC_REVS_ProPlus_Eval_v480.Zip

    《代码自动生成流程图软件——CrystalC_REVS_ProPlus_Eval_v480深度解析》 在编程领域,代码自动生成工具已经成为了提高开发效率、优化工作流程的关键要素。其中,“CrystalC_REVS_ProPlus_Eval_v480”是一款备受...

    Faster R-CNN中voc_eval.py文件

    借助Faster R-CNN中voc_eval.py文件,测试YOLO测试数据集mAP等结果,博客见

    license_eval_halcon_steady_2021_07.dat等多个文件.rar

    标题中的"license_eval_halcon_steady_2021_07.dat"是一个与HALCON软件相关的许可评估文件。HALCON是MVTec公司开发的一款广泛应用的机器视觉软件,它提供了全面的图像处理功能,包括形状匹配、模板匹配、1D/2D码识别...

    GD32E103C_EVAL.rar

    《GD32E103C_EVAL:嵌入式操作系统移植与应用详解》 GD32E103C_EVAL.rar 是一个针对GD32E103微控制器的资源包,它包含了多个流行的实时操作系统(RTOS)的移植版本,包括FreeRTOS、RT-Thread、ucos_ii、ucosiii以及...

    GD32E230C_EVAL.rar

    标题中的"GD32E230C_EVAL.rar"是一个压缩包文件,主要涉及的是GD32系列微控制器,特别是GD32E230C评估板上的固件移植示例。GD32是由国内知名半导体公司GigaDevice(兆易创新)推出的32位通用MCU产品线,其E230系列...

    trec_eval.exe

    《信息检索效果评价工具trec_eval.exe详解及应用》 在信息时代,高效、准确的信息检索系统成为我们获取知识和解决问题的重要途径。然而,如何衡量一个信息检索系统的性能呢?这就需要借助专业的评估工具——trec_...

    GD32107C_EVAL LiteOS FreeRTOS_key uCOS_III_key RTOS Demo源代码.zip

    该压缩包文件包含了一系列关于GD32107C_EVAL开发板上运行的不同实时操作系统(RTOS)的Demo源代码,这些RTOS包括LiteOS、FreeRTOS、uCOS_III和RT-Thread,以及相关的库文件。这里我们将深入探讨这些RTOS及其在GD...

    reset_eval.rar

    标题“reset_eval.rar”暗示了这是一个包含重置评估工具的压缩文件,可能是为了帮助用户恢复注册表到初始状态或者清除特定软件的残留设置。该压缩包可能包含针对Windows和Linux两个不同操作系统的脚本,因为这两个...

    GD32150R_EVAL_GD32F1x0_Firmware_Library_Routine

    【GD32150R_EVAL_GD32F1x0_Firmware_Library_Routine】是GD32微控制器系列中的一个软件开发资源,专为GD32150R评估板设计。这个库包含了丰富的例程,帮助开发者更好地理解和使用GD32F1x0系列芯片的功能。GD32是GD ...

Global site tag (gtag.js) - Google Analytics