- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在Metaprogramming Ruby 2在第 2 章的“Refinements”部分,我找到了以下 Ruby 代码:
class MyClass
def my_method
"original my_method()"
end
def another_method
my_method
end
end
module MyClassRefinement
refine MyClass do
def my_method
"refined my_method()"
end
end
end
using MyClassRefinement
MyClass.new.my_method # => "refined my_method()"
MyClass.new.another_method # => "original my_method()" - How is this possible?
据作者说:
However, the call to
another_method
could catch you off guard: even if you callanother_method
afterusing
, the call tomy_method
itself happens beforeusing
— so it calls the original, unrefined version of the method.
这完全把我绊倒了。
为什么 MyClass.new.another_method
打印“original my_method()”,因为它是在 using MyClassRefinement
之后使用的,作者在这里想表达什么?
谁能提供更直观/更好的解释?
谢谢。
最佳答案
我能找到的最好的解释来自 the docs :
Refinements are lexical in scope. Refinements are only active within a scope after the call to
using
. Any code before theusing
statement will not have the refinement activated.
这意味着您的优化方法必须在调用 using
之后的某处调用.调用方法的实际位置才是最重要的,而不是调用方法的方式或调用方法的位置。
这是发生了什么。
using
即 using MyClassRefinement
激活 my_method
细化。 MyClass.new.my_method
被执行。When looking up a method for an instance of
class C
Ruby checks:
- If refinements are active for
C
, in the reverse order they were activated
- The prepended modules from the refinement for
C
- The refinement for
C
- The included modules from the refinement for
C
- The prepended modules of
C
C
- The included modules of
C
my_method
返回细化的代码 "refined my_method()"
MyClass.new.another_method
被执行。another_method
不是细化,所以 Ruby 寻找 another_method
在类里面MyClass
并找到它。another_method
, 方法 my_method
找到并调用。using
在线之上(即物理上之前),其中 my_method
被调用。 Ruby 继续寻找 my_method
在类里面MyClass
并找到它。my_method
从类方法返回代码 "original my_method()"
.
我们可以做一个简单的比较。假设我有一个隔离的 file.rb
使用以下代码:
puts puppy
puppy = 'waggle'
puppy
在定义之前不能使用。该变量是词法范围的,其使用取决于其定义在隔离的 file.rb
中的位置。 .
类似地,细化只有通过using
激活后才能被调用。在前一行(或源代码文件中物理上的某个位置)。细化为 lexically scoped .
In languages with lexical scope (also called static scope), name resolution depends on the location in the source code and the lexical context, which is defined by where the named variable or function is defined...
Lexical resolution can be determined at compile time, and is also known as early binding, while dynamic resolution can in general only be determined at run time, and thus is known as late binding.
this article 的最后一节讨论了您关于改进的具体问题。
。作者还解释了 using
语句在文件中的物理位置决定了细化是否处于事件状态。
关于Ruby 改进陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46623706/
我对编码还比较陌生,但并非完全没有经验。处理有关金融计算器的学校作业。如果你们中的任何人可以查看我的代码以了解不良做法/可能的改进等,那就太好了。 我确实添加了一个“动画”启动(有很多 printf
小目标Trick 论文链接: https://paperswithcode.com/paper/slicing-aided-hyper-inference-and-fine-tuning 代码链接:h
if (firstPositionCpc && (firstPosition > 0 && firstPositionCpc 0 && topOfPageCpc 0 && firstPageCpc
我有 2 个表:“packages”和“items”。 “packages”有以下列:pack_id | item_id “items”有以下列......:item_id |输入 一个包可以有多个
我目前有一个 Pandas Dataframe,我在其中执行列之间的比较。我发现一种情况,在进行比较时存在空列,由于某种原因比较返回 else 值。我添加了一个额外的语句来将其清理为空。看看我是否可以
我正在处理一个查询,通过首先舍入它们的主要日期时间键来连接一个数据库中的多个表。数据库包含来自 openhab 的性能数据,每个表只有一个名为 Time 的主日期时间行和一个名为 Value 的值行。
问候 我有一个程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的 Update 方法并等待完成。我从 this question 开始关注 Kev 的方法将更新添加到 ThreadPool.
我想在下学期的类(class)中取得领先,所以我制作了这个基本版本的 Blackjack 来开始理解 C 的基础知识,我希望您有任何想法可以帮助我更好地理解 C 和其正常的编码实践。 C 中的很多东西
我有一个要求,比如: 给定一个数组,其中包含随机数。需要输出元素出现的次数,有自带解决方案: var myArr = [3,2,1,2,3,1,4,5,4,6,7,7,9,1,123,0,123];
这是我的数据库项目。 表user_ select id, name from user_; id | name ----+---------- 1 | bartek 2 | bartek
我已经完成了一个小批量脚本来调整(动态)一些图像的大小: for a in *.{png,PNG,jpg,JPG,jpeg,JPEG,bmp,BMP} ; do convert "$a" -resiz
是否有更 pythonic 的方法来执行以下代码?我想在一行中完成 parsed_rows 是一个可以返回大小为 3 或 None 的元组的函数。 parsed_rows = [ parse_row(
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
下面的代码完成了我想要的,但还有其他更像 python 风格的方式吗? 文件格式: key1:value1,key2:value2,... key21:value21,key22:value22,..
如果两个英文单词只包含相同的字母,则它们是相似的。例如,food 和 good 不相似,但 dog 和 good 相似。 (如果A与B相似,则A中的所有字母都包含在B中,B中的所有字母都包含在A中。)
我有以下结构来表示二叉树: typedef struct node *pnode; typedef struct node { int val; pnode left; pnode
我有一个区域,它由受约束的 delaunay 三角剖分表示。我正在解决在两点之间寻找路径的问题。我正在使用 Marcelo Kallmann 提供的论文作为解决此问题的引用点。然而,而不是使用 Kal
如果我需要检查文本(字符串)中是否存在单词 A 或单词 B,如果我这样做会有性能差异: if(text.contains(wordA) || text.contains(wordB)) 要使用一些正则
Adjust To 我有上面这个简单的页面,上面有一个标签和一个文本框。我想在文本框中输入文本。 对我有帮助的 XPATH 是 //*[contains(tex
以下伪代码的elisp代码 if "the emacs version is less than 23.1.x" do something else something-else 写成 (if
我是一名优秀的程序员,十分优秀!