【Ruby】instance_eval和class_eval用法讲解

用CelebA数据集玩点不一样的:5个PyTorch实战小项目,从属性分类到人脸生成 本文介绍了5个基于CelebA数据集的PyTorch实战项目,涵盖从属性分类到人脸生成的多种应用。通过构建微笑检测器、多属性预测系统、人脸对齐算法、StyleGAN人脸生成和人脸验证系统,展示了CelebA数据集在计算机视觉中的强大潜力。这些项目不仅适合深度学习初学者,也为进阶开发者提供了创新思路。 阅读详情

最近开始学习Ruby,在看到instance_eval和class_eval的用法时,觉得很是困惑,于是对此进行研究并整理一下。

首先,我们先定义一个Test类,该类包含一个类方法print_class_var和一个实例方法print_var。在print_class_var中,我们定义了一个属于Test类的实例变量var,而在print_var中,我们定义了一个属于Test类实例的实例变量var,这两个var是不一样的。然后我们创建Test类的一个实例test,然后并分别对Test类和test实例使用instance_eval和class_eval。

class Test
  def self.print_class_var
    puts @var
  end

  def print_var
    puts @var
  end
end

test = Test.new

Test.instance_eval do
  def method1
    @var = 1
    puts "Class method"
  end
end

test.instance_eval do
  def method2
    @var = 2 
    puts "Eigenclass method"
  end
end

Test.class_eval do
  def method3
    @var = 3
    puts "Instance method"
  end
end

首先,我们对Test.instance_eval进行测试,分别调用Test.method1和test.method1。

 

Test.method1  #Class method
Test.print_class_var #1
test.print_var #

test.method1  #undefined method `method1' for #<Test:0x007fc5db945bd0> (NoMethodError)

可以看出,Test.method1能正常输出,而test.method1无法运行,并且在Test.method1执行之后,Test.print_class_var有输出结果,test.print_var没有输出结果,即Test.method1对Test类的实例变量进行了设置。

然后,我们对test.instance_eval进行测试,分别调用Test.method2和test.method2。

Test.method2  #undefined method `method2' for Test:Class (NoMethodError)

test.method2  #Eigenclass method
Test.print_class_var #
test.print_var #2

可以看出,Test.method2无法运行,而test.method2能正常输出,并且在test.method2执行之后,Test.print_class_var没有输出结果,test.print_var有输出结果,即test.method2对test的实例变量进行了设置。

最后,我们对Test.class_eval进行测试,分别调用Test.method3和test.method3。

Test.method3  #undefined method `method3' for Test:Class (NoMethodError)

test.method3  #Instance method
Test.print_class_var #
test.print_var #3

可以看出,Test.method3无法运行,而test.method3能正常输出,并且在Test.method3执行之后,Test.print_class_var没有输出结果,test.print_var有输出结果,即test.method3对test的实例变量进行了设置。

在做完上面3个测试之后,相信大家都很困惑,到底instance_eval和class_eval有什么区别呢?按照字面上的理解,instance_eval应该是用来创建实例方法,而class_eval应该是用来创建类方法。

但实际上,结果恰恰相反,instance_eval必须由instance来调用,可以用来定义单例方法(Eigenclass Method或者Singleton Method);而class_eval必须由class来调用,可以用来定义实例方法(Instance Method)。


对于Test.instance_eval的测试,由于Test类是Class类的一个实例,因此就定义了Test类的单例方法method1,而类方法属于单例方法,进而method1只会对Test类的实例变量进行操作。

对于test.instance_eval的测试,由于test是Test类的一个实例,因此就定义了test实例的单例方法method2,进而只会对test的实例变量进行操作。

对于Test.class_eval的测试,由于定义了Test类的实例方法method3,因此只会对test的实例变量进行操作。



转载请注明出处: http://blog.youkuaiyun.com/sunset108/article/details/48136571



35、Ruby 中的 instance_eval、class_eval 与钩子方法详解 本文深入解析了 Ruby 中的 instance_eval、class_eval 方法及其在元编程中的应用,同时详细介绍了钩子方法如 inherited 和 method_missing 的使用场景与实现技巧。通过实例展示了如何利用这些特性实现灵活的类操作、动态方法定义及领域特定语言(DSL)构建,并总结了最佳实践和注意事项,帮助开发者更好地掌握 Ruby 的高级编程技巧。 阅读详情

相关推荐

35、Ruby 中的 instance_eval、class_eval 与钩子方法使用指南

本文详细介绍了 Ruby 中的 instance_eval、class_eval 方法及其在元编程中的应用,同时探讨了钩子方法(如 method_missing 和 inherited)的使用场景和实现技巧。通过示例和对比分析,帮助开发者更好地理解这些高级特性,从而编写出更灵活、高效的 Ruby 代码。

tcp8optimizer的博客 110

深入理解 Ruby 中的 instance_eval 和 class_eval

Ruby 通过 eval 可以将字符串当做代码来执行,而执行环境是通过 binding 进行绑定的;除此之外,Ruby 还有另外两个方法:instance_eval 和 class_eval, 用来执行代码块。后者的执行上下文与调用者相关。instance_eval: 调用者必须是实例 instance; class_eval: 调用者必须是类 class;下面的例子帮助识别两个方法的区别:[1]

抱朴守拙 2833

Ruby中的Metaprogramming:使用instance_eval和class_eval

Ruby中的metaprogramming是一种强大的特性,允许程序在运行时改变自身结构。本文探讨了instance_eval和class_eval方法的使用,它们通过改变self的上下文来动态定义方法。同时,文章还介绍了instance_exec、class_exec和module_exec方法,以及如何在DSL(领域特定语言)中利用这些方法实现复杂功能。

weixin_42186015的博客 506

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

在Ruby中,正则表达式通常被包含在正斜杠中。例如,/pattern/定义了一个简单的正则表达式,其中pattern是你想要匹配的模式。用于在对象实例的上下文中执行代码,可以定义单例方法。class_eval用于在类的上下文中执行代码,可以定义实例方法。的调用者必须是实例,而class_eval的调用者必须是类。这些方法在 Ruby 的元编程中非常有用,可以动态地添加方法和行为。如能打赏、那更好了!

IT老农民的博客 1073

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

unique_sir的博客 1万+

MCGS触摸屏数据记录与U盘导出配置全解析

在工业自动化现场,数据记录是设备运行状态分析与故障追溯的基础。HMI触摸屏作为人机交互核心,不仅承担实时监控任务,还负责过程数据的存储与导出。理解数据采集周期、存盘机制与存储介质的匹配原理,能帮助工程师高效配置数据记录功能。合理运用定时存盘、存盘组与U盘导出,可支撑设备趋势分析、报表生成及事故排查。本文以MCGS触摸屏为例,详解数据记录的完整组态流程,并汇总常见配置陷阱与排查思路,为现场调试与长期运维提供可落地的技术参考。

weixin_34253126的博客 459

Ruby中的class_eval方法以及__FILE__和__LINE__参数

原文:Ruby class_eval, FILE and LINE arguments 这里我们将讨论一个class_eval调用的例子def my_attr_reader(sym) class_eval <<-READER, __FILE__ , __LINE__ + 1 def #{sym} @#{sym} end RE

ミ安之偌素 1455

CS5523实战:如何用国产芯片完美替代LT8911设计MIPI转eDP电路(附原理图)

本文详细介绍了使用国产芯片CS5523完美替代LT8911进行MIPI转eDP电路设计的实战经验。文章从芯片选型、核心特性对比入手,深入剖析了电源时钟设计、MIPI/eDP接口的PCB布局与信号完整性要点,并提供了完整的原理图参考和调试排错指南,为硬件工程师实现国产化替代提供了清晰可行的方案。

yhn4567890的博客 1140

ruby的instance_eval和class_eval, self && current class

转载请包含源链接:http://blog.youkuaiyun.com/wu4long/article/details/42191929         ruby语言中,尤其是meta programming中,很多初学者或者有一定经验者,都未必能搞的清楚instance_eval和class_eval以及self和current class。         首先我们要明确一点,在任何时刻,ruby

wu4long的专栏 1659

小白的MatSWMM使用心路(二)——用matlab修改INP文件参数/使用matlab查找txt内容并修改多行内容

说是修改inp,但是里面的内容大部分还是讲怎么修改txt的……(?)。包含如何找到需要的参数(关键字)位置,以及修改那个位置的txt这样的内容。希望能帮助大家吧……Matlab你要多出好用的功能啊!

weixin_44276743的博客 4530

在 SAP BAS 中扩展标准 SAP Fiori 应用并部署到 ABAP 环境的完整实践指南

SAPUI5 Adaptation Project 摘要(148字) SAPUI5 Adaptation Project 提供了一种高效扩展标准Fiori应用的方式,通过创建应用变体(Application Variant)实现差异化定制。开发者可在SAP BAS中使用可视化编辑器修改UI元素(如隐藏字段、调整表格布局、添加按钮等),而无需重写业务逻辑。变体部署到ABAP环境后,可与标准应用并行使用,且能随原应用升级保持同步。典型应用场景包括为不同用户角色定制简化界面或增强特定功能,既满足个性化需求,又保留

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

ruby的class << self, 及其class_eval和instance_eval的区别

ruby的class 昨天在看web敏捷开发之道的时候看到class 关于class 定义singleton_methods有三种方式 第一种: 直接给对象打开定义 这是最简单相信也是见得最多的一种方式: [ruby]  view plain copy a = A

419

论文阅读:ICLR 2026 Breaking and Fixing Defenses Against Control-Flow Hijacking in Multi-Agent Systems

该论文首先系统阐述了控制流劫持攻击的核心机理。此类攻击通过操纵多智能体系统的编排机制,诱导系统执行非安全操作,进而实现敏感信息窃取。攻击者将恶意指令伪装成环境错误信息,借助可信代理传递至系统编排器,利用"困惑副手"漏洞绕过传统安全防线。该论文指出,现有防御方案如LlamaFirewall所依赖的对齐检查机制存在根本性局限——安全目标与功能需求之间存在不可调和的内在冲突。该论文的核心贡献体现在攻防两个维度。

CSPhD-winston的博客 493

[Ruby] ruby创建类方法 ,以及class_eval 、instance_eval的使用

ruby创建类方法 的途径有很多  第一种   class TextClass def TextClass.method #code end end 第二种 class TextClass def TextClass::method #code end end 第三种 class TextClass def self.method #code

Xunzi229的博客 2066

33、密码学中的选择密文攻击与Cramer - Shoup加密方案

本文详细介绍了密码学中选择密文攻击的背景及其对Cramer-Shoup公钥加密方案的影响。该方案在决策Diffie-Hellman假设和抗碰撞哈希函数的基础上,能够有效抵御自适应选择密文攻击,并且其安全性无需依赖随机预言机模型。文章还分析了Cramer-Shoup方案的设计原理、加密与解密过程,以及其在标准假设下的安全性证明方法。此外,通过一系列相关练习,帮助读者进一步理解密码学概念如密文不可区分性、ElGamal加密、Goldwasser-Micali方案等。最后,文章展望了密码学的未来发展趋势,包括量子

vscode6remote的博客 99

安路TangDynasty和FD和JTAG驱动器安装

安路FPGA产品矩阵包含SALPHOENIX高性能、SALEAGLE高性价比和SALELF低功耗三大系列,广泛应用于网络通信、消费电子等领域。配套的TangDynasty(TD)集成开发环境支持标准设计输入,提供完整优化流程与调试工具。简要介绍了TD 6.2.1版本的安装步骤。

wangjie36的博客 1037

Ruby 中class_eval 是什么

在 Ruby 中,class_eval是一个非常强大的方法,它允许你在运行时动态地修改或扩展类的定义。具体来说,class_eval方法可以让你打开一个已有的类(甚至包括核心类),并在该类中添加新的方法、修改现有方法或者执行其他代码块。class_eval。

Java的专栏 639

android 蓝牙通讯demo

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

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_...

dadadada2x的专栏 329

蓝牙模块HM-10手册

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Day13 - Ruby比一比: instance_eval 和 class_eval方法

第13天!昨天谈到了class variable,class instance variable和instance variable,也发现在实务上,类别实体变数和实体变数才是主流。今天我们要多谈两个跟前一篇的变数有关的方法:instance_eval和class_eval。让每天都主题都环环相扣! Ruby经典面试题目#13 instance_eval和class_eval的...

weixin_30906701的博客 148

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Ruby instance_eval 与 class_eval

@(Ruby)[class_eval, instance_eval] 在irb模式下,instance是无法调用class_eval方法的,而在 rails c模式下是可以的。class A end A.instance_eval do def test_method1 p 'this is from A.instance_eval' end end A.class_eval do

张小琦的博客专栏 1411

ruby 有哪些 eval

eval:最通用的形式,适用于任何地方,但要小心使用以避免安全问题。:专门用于类或模块内部,用于动态添加或修改方法。:针对特定对象,在对象自身的作用域内执行代码,常用于添加单件方法。:基于某个特定的作用域执行代码,提供了更细粒度的控制。理解这些不同形式的eval及其适用场景,可以帮助你更有效地利用 Ruby 的动态特性进行开发。然而,由于eval家族的方法能够执行任意代码,因此在使用时应谨慎考虑安全性问题。

Java的专栏 414

ruby_的class_eval和instance_eval简记

  有很多文章来讲这个ruby rails中最重要最频繁使用的方法。 详细的理解,还需要去仔细理解ruby中的对象模型等。 略。   时间一长,就会忘记的,或者得回忆一下了,尤其是去写一段时间别的语言例如java python,再回来的时候,发现,哦,忘记了~需要再想想对象模型,恩,理解了。   很麻烦,对不对,何不让大脑休息一下~找个简记方法吧: *1 C.class_eval ...

fantaxy025025的专栏 190

[ruby]单例类 singleton class,class_eval vs instance_eval

单例类定义被用于定义对象的专属实例方法。 # 初始化变量 str1 = 'Ruby' # String的一个对象 str2 = 'Ruby' # String的一个对象 str3 = 'ruby' # String的一个对象 str4 = [1,2] # Array的一个对象 str5 = {a:6} # Hash的一个对象 str6 = 1 # Numeric的一个对象 str7 = Numeric.new 在类中定义类方法, class << 类名 ~ end这种写法的.

深度的博客 322

class_eval,class_exec,instance_eval,instance_exec

原文出处http://blog.58share.com/?p=370 class_eval class_eval的调用者是类,在class_eval的block的内部,self既是该类自己 1 class A; end 2 a = A.new 3

写代码的小孩 1305
上一篇: 【MySQL】连接查询中索引的重要性
下一篇: Sublime Text Plugin
低调de走过
博客等级 码龄17年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值