ruby - Ruby:在屈服期间,谁是块内的自我?
问题描述
也许这是一个愚蠢的问题,但我无法弄清楚。我有一种“感觉”,为什么main
是self
在执行块期间。但我没有一个可靠的解释。
似乎是谁的问题self
取决于定义块的上下文。这是正确的吗?
谁能给我解释一下?
?> class Klass
?> def yld
?> yield
?> end
>> end
>>
>> o1 = Klass.new
>> o2 = Klass.new
>>
?> o1.yld {
?> o2.yld {
?> p self
?> }
>> }
main
解决方案
self
不会因为阻塞而改变。你得到的原因是因为你是从主上下文main
调用的:yld
p self #=> main
o1.yld {
p self #=> main
o2.yld {
p self #=> main
}
p self #=> main
}
p self #=> main
但是,self
可以显式更改,例如通过instance_eval
:
def foo(&block)
"hello".instance_eval(&block)
end
p self #=> main
foo {
p self #=> "hello"
p size #=> 5
p upcase #=> "HELLO"
}
p self #=> main
在上面的代码中,块期间self
被更改为字符串实例"hello"
。
推荐阅读
- php - 控制台调用未定义方法 Illuminate\Foundation\Application::where() 中的 Laravel ACL 错误
- python - 如何让 pygame 将单击鼠标识别为单击鼠标?
- postman - allauth rest_freamework CSRF 验证失败。请求中止
- android - 在Android中将变量从父视图传递到子视图
- c# - System.IndexOutOfRangeException: '索引超出了数组的范围。' 当我尝试在 C# 中将 csv 转换为 dataGridView
- java - zip4j ZipFile 到字节数组
- java - 用于存储对象数组列表的二维数组列表或数组列表映射?
- python - Python 脚本无法与 crontab 一起使用
- javascript - 如何仅在 Vue.js 中模糊 svg 背景?
- amazon-web-services - 使用 AWS SAM CLI、CDK 和 Lambda 层时无法在本地调试