问题标签 [refinements]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2827 浏览

ruby - Ruby 2.0 中的改进完全没用吗?

Ruby 2.0 中引入了所谓的改进。我和他们一起玩,现在我完全被哄骗了:

— 声明的主要优点refine是它们不是全局范围的。呸。

是孤立的,不是更糟。

— 改进不支持类方法。呸。当然,它们是通过 hack(记住,一切都是对象):

后者甚至不会导致性能损失,因为没有人会Fixnum.substr故意调用。

— 细化是通过 执行的evalrefine不是关键字。呸。(嗯,“呸!”再次。)

所以,我的问题是:我是否错过了什么或者每个人都认为新引入的功能没有优势?

0 投票
2 回答
1956 浏览

ruby - 将 ruby​​ 类转换为模块比使用改进更好的方法?

Module#refine方法接受一个类和一个块并返回一个细化模块,所以我想我可以定义:

并且以下测试通过

因此,使用细化,我可以将一个类变成一个模块,动态地细化其行为,并将其包含在其他类中。

  • 有没有更简单的方法可以将一个类变成 Ruby 中的一个模块(比如在 ruby​​ < 2 中)?
  • rb_mod_refine的 C 实现中, 我们看到

    这只是将细化的超类设置为klass复制细化模块内的类的实现吗?

  • 我知道多重继承是通过模块完成的,但是社区会如何看待上述内容Class#include_refined?从改进中提取这方面是否合理?“本地”修补类内部而不是使用“使用”开关来激活细化?
0 投票
2 回答
651 浏览

ruby-on-rails-4 - 如何在 Rails 视图中使用 Ruby 改进?

我有一个使用 Ruby 2.0 的 Rails 4 项目。我已经定义了一些改进。推杆

在视图文件的顶部会导致错误“未定义的方法'使用'”。

当我添加:

在我的控制器顶部(在类声明上方),我可以成功地使用控制器中的细化,但如果我尝试在视图中使用它,则会收到“未定义方法”错误。

谢谢!

0 投票
2 回答
1121 浏览

ruby-on-rails - 如何在 Rails 控制器/动作中使用 Ruby 改进?

如果我在控制器之外尝试它可以工作:

如果我在控制器内部尝试或操作它不起作用:

它抛出'未定义的方法'使用'。

我读了这篇文章,作者在课堂上使用它:timelessrepo.com/refinements-in-ruby

0 投票
2 回答
2130 浏览

ruby - 细化是否仅适用于实例方法?

我正在尝试了解 Ruby 的改进功能,但遇到了一个我不理解的场景。

以这个示例代码为例:

现在,当我在 REPL 中执行此操作时:

为什么是#what_are_you精致的,但.preferred_accommodation不是?

0 投票
1 回答
601 浏览

ruby - Ruby 改进的细微之处

这里有一个很好的关于当前在 ruby​​ 中实现改进的文档: http ://ruby-doc.org//core-2.2.0/doc/syntax/refinements_rdoc.html ,但是有一些奇怪的极端情况。

首先,include module正交于using module(一个包括模块的实例方法,而另一个激活细化)。但是包含一个细化模块本身有一个技巧,请参阅 Better way to turn a ruby​​ class into a module而不是使用细化?.

奇怪的是,这个细化模块不能与using!

因此,仅使用精化模块的封闭模块。其次,我想使用上面的 yield 技巧来传递一个 Proc 来优化(即使它只接受一个块),而不是像 https://www.new-bamboo.co那样将 Proc 转换回源代码.uk/blog/2014/02/05/refinements-under-the-knife/。但是yield在包含示例中使用 as 不起作用:

我们看到 Receiver1 仍然使用 Bar#foo 而不是提炼的方法。但是我们可以module_eval改用:

我不太明白为什么module_eval在这里工作而不是yield方法。在细化块内,“default_definee”是细化模块,因此module_eval将“default_definee”置于self=“细化模块”不应影响它。实际上,在开头的“包含”示例中,当我使用module_eval或直接使用yield.

谁能解释这种行为?

0 投票
1 回答
163 浏览

ruby - 分层使用细化

改进是对 v2.0 的实验性补充,然后在 v2.1 中进行了修改并永久化。通过提供“一种在本地扩展类的方法”,它提供了一种避免“猴子补丁”的方法。

我试图申请Refinements这个最近的问题,我将因此简化:

如果:i_ a_ i_b

换句话说,字符串的匹配与大小写无关。

问题是确定a与 的对应元素匹配的元素数量b。我们看到答案是两个,偏移量1和的元素2

一种方法是猴子补丁String#==

或者改为使用Refinements

但是,我想这样使用Refinements

但是,如您所见,这给出了错误的答案。那是因为我正在调用Array#==并且细化不适用于Array.

我可以这样做:

但这不是我想要的。我想做这样的事情:

但显然这不起作用。

我的问题:有没有一种方法可以优化String用于Array,然后优化Array用于我的方法?

0 投票
1 回答
124 浏览

ruby - Ruby 中的细化

除了在模块中使用它之外,还有什么方法可以限制单个 ruby​​ 程序中的改进效果?

例如,假设细化的名称是 StringRefinement,当我们使用 StringRefinement 键入时,它开始生效,并且一直有效到程序文件结束。

有没有办法限制它的边界,这样程序的某些后期部分就不会产生这种细化的效果?

0 投票
1 回答
117 浏览

ruby - 如何在 ruby​​ 改进之间共享代码?

这按预期工作。但是,如果我想在和之间共享foobar使用HashArrayinclude会失败。

有没有办法在改进之间共享代码?

0 投票
1 回答
40 浏览

ruby - Ruby2.0:Ruby Refinements 和 Monkeypatches 有什么区别?

无论哪种方式,我都可以做一些简单的任务,

改进

所以,我可以在模块所在的do_something任何地方使用方法。StringRefinementsusing

猴子补丁

我想知道 Ruby 的新概念RefinementsMonkeypatch. 使用Refinementsover有什么好处Monkeypatch