![]() |
1
13
下面是另一种方法,它消除了别名方法名称之间的冲突问题(请注意,我的其他解决方案使用模块进行装饰也是一种很好的选择,因为它也避免了冲突):
以上代码有效,因为
|
![]() |
2
11
好吧,我该回答了。我在这里专门针对那些试图重组大脑的蟒蛇。下面是一些有大量文档记录的代码,它们(大约)完成了我最初尝试的工作: 正在修饰实例方法
还是很困惑?我不会感到惊讶的,这几乎花了我一整天的时间。你应该知道的其他一些事情:
装饰类方法上面的代码修饰实例方法。如果你想直接在课堂上装饰方法呢?如果你读 http://www.rubyfleebie.com/understanding-class-methods-in-ruby 您会发现有三种方法可以创建类方法——但是这里只有一种方法对我们有用。
那是匿名者
玩得高兴! |
![]() |
3
7
类似于python的修饰符可以在Ruby中实现。我不会尝试解释和举例,因为Yehuda Katz已经在Ruby上发表了一篇关于装饰师DSL的好博客文章,所以我强烈建议阅读: 最新消息:我有几次投票否决这一项,所以让我进一步解释。
通常,装饰器的目的不是改变任何给定方法的内部结构,并且仍然能够从修改后的版本调用原始方法,而是增强函数行为。“入口/出口”用例,它与
|
![]() |
4
4
这是一个有点不寻常的问题,但很有趣。首先,我强烈建议您不要尝试直接将您的Python知识传递给Ruby——最好学习Ruby的习惯用法并直接应用它们,而不是尝试直接传递Python。我经常使用这两种语言,它们在遵循自己的规则和约定时都是最好的。 说了这么多之后,这里有一些漂亮的代码可以使用。
这就产生了
我相信你会同意的。 |
![]() |
5
3
到目前为止,imo mooware有最好的答案,它是最干净、最简单和最惯用的。然而,他使用的是“alias-method-chain”,它是Rails的一部分,而不是纯Ruby。下面是一个使用纯Ruby的重写:
您也可以使用模块来完成相同的事情:
|
![]() |
6
3
用Python中的装饰器可以实现什么,用Ruby中的块可以实现什么。(我无法相信这一页上有多少答案,没有一个屈服声明!)
这个概念是相似的。使用Python中的decorator,您实际上是在传递函数“square”,从“wrap”中调用它。对于Ruby中的块,我传递的不是函数本身,而是一个调用函数的代码块,该代码块在“wrap”上下文中执行,其中yield语句是。 与decorator不同,正在传递的Ruby块不需要函数作为它的一部分。以上可能只是:
|
![]() |
7
2
迈克尔·费尔利在2012年的Railsconf上证明了这一点。代码可用 here on Github . 简单用法示例:
|
![]() |
8
1
你的猜测是对的。 最好使用别名将原始方法绑定到另一个名称,然后定义新方法以打印某些内容并调用旧方法。如果您需要重复这样做,您可以为任何方法创建一个这样做的方法(我曾经有一个示例,但现在找不到它)。 PS: 您的代码不在函数中定义函数,而是在同一对象上定义另一个函数(是的,这是Ruby的一个未记录的特性)
定义两者
注意: 引用函数的方法是
|
![]() |
9
1
好吧,又找到了我的代码,它在Ruby中做装饰。它使用别名将原始方法绑定到另一个名称,然后定义新方法以打印某些内容并调用旧方法。所有这些都是使用eval完成的,这样它就可以像Python中的装饰器一样被重用。
编辑: 这里同样有一块(没有线绳操作的痛苦)
|
![]() |
10
0
我相信相应的Ruby习惯用法是Alias方法链,它被Rails大量使用。 This article 它也被认为是红宝石风格的装饰。 对于您的示例,应该如下所示:
这个
我相信Ruby1.8没有内置这个方法,所以您必须从Rails中复制它,但是1.9应该包含它。 我的Ruby技能有点生疏,所以如果代码实际上不起作用,我很抱歉,但我确信它演示了这个概念。 |
![]() |
mueslo Thomas Kühn · 修饰类方法以构建方法注册表 7 年前 |
![]() |
Mr.Dreamer · 类方法的python装饰器 7 年前 |
![]() |
Igor Pozdeev · 属性getter和上下文管理器 7 年前 |
![]() |
Miles P · Typescript类型检查不适用于我的装饰程序 7 年前 |
|
Ryohei · 如何在我的软件包中使用decorator 7 年前 |
|
user7696297 · python中的函数修饰符是什么 7 年前 |
![]() |
lilezek · 限制方法修饰符的使用 7 年前 |