问题标签 [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.
ruby - ruby 中 Refinements 和 redefine 类的区别
我正在阅读一些关于 ruby 编程语言的书,并且想知道这样的东西是如何工作的
我知道有一个内置字符串,我来自(C++)顺便说一句,所以class string
在定义一个对象时创建会产生歧义string x = new string()
,我搜索了一下,我发现一些概念被命名refinement
,它允许我们修改和添加函数到String
类,我看到他们使用关键字refine
来制作这些东西(根据文档),但是我的问题来了,当我把上面的类放在上面irb
并开始像这样测试它时"amr adel".word_count
,它给了我正确的结果,我预计不会一开始工作,所以如果它有效,为什么我什至可以refine
在我的代码中使用为什么我不只创建一个与内置类同名的类并放置附加函数和修改函数,这种方式是否在进行细化过程隐含的?
我承认 ruby 很棒而且很容易使用,但我想知道事情还在继续。
如果您可以参考一些文章或其他内容,将不胜感激谢谢
sharepoint - Sharepoint 细化面包屑
根据附件,如何在 SharePoint 中创建细化面包屑?
请帮我。谢谢...
ruby-on-rails - 通过细化添加的方法在 Rails 控制器中不可见
我Enumerable
在 Rails 控制器中改进了模块,如下所示,添加了一种方法,据我所知,Rails 或标准库中尚不存在该方法:
调用控制器操作test
会导致NoMethodError
:
为了缩小问题范围,我创建了一个具有相同结构的独立文件(没有 Rails 环境):
在这种情况下,调用测试方法会得到预期的结果:
另外,如果我直接在 Enumerable 上定义了 ordered_group_by 方法,而不使用refine
,我可以成功调用该方法。
有什么原因导致这在 Rails 的上下文中不能作为改进工作,还是我还缺少其他东西?
编辑:我使用的是 rails 5.2.0,这是一个空项目,只有rails new _
并且rails generate controller Test test
已经运行。
scope - 类的范围猴子修补
我需要修补一个类,但希望修补程序对某些模块是本地的。在 Ruby 中,我会这样做:
水晶里有类似的东西吗?
ruby-on-rails - 在 ActiveRecord 模型中使用细化时出现 NoMethodError
红宝石:2.3.7
导轨:4.2.10
我有以下实现,我想使用 Refinements 将方法添加到 String 类
显而易见numeric?
的是 String 类的精炼方法。
但是,我失败了NoMethodError
我在这里做错了什么?
ruby - 猴子补丁方法只在我自己的代码中(通过自动使用改进?)
在我的 Ruby (on Rails) 项目中,我想禁止或限制使用标准库提供的某些方法。示例:我想禁止调用Float#to_d
,因为当有人在 Float 文字上使用该方法时出现舍入错误。我想限制String#to_d
只使用完全有效的字符串,因为'string'.to_d
返回0.0
.
在全球范围内修补/覆盖这些方法当然是个坏主意。它可能会破坏一些依赖性。
添加一个扫描代码以不调用任何#to_d
方法的 linter 规则的问题是,它错误地限制了调用合法方法,如Integer#to_d
. 当然,所有合法方法都可以以不同的名称添加到相应的类中。但这需要添加很多样板(用于方法)并更改这些方法的所有调用。
我还考虑过使用改进。这类似于猴子补丁,但仅适用于使用细化的范围。但是,必须using
向每个文件添加语句会很丑陋且容易出错。是否可以为我的项目中的每个文件自动激活优化,但不能为依赖项激活?
ruby - 如何优化 HTTP::Headers.normalize_header?
HTTP::headers 中的 normalize_header 将下划线变成破折号(https://github.com/httprb/http/issues/337)。这在某些情况下是不正确的。我可以轻松地修补这个。但我试图弄清楚如何使用改进来缩小修改范围。
但这不起作用。我的直觉是,一旦我们处于最终调用 normalize_header 的范围内,我就错过了一些没有激活细化的东西,但我不知道如何安排它工作。
ruby - ruby 中的可配置改进
我想用配置对象修补现有库的一部分:
Library::A
应该有一些预定义的配置,并且Library::B
应该有自己的配置。不幸的是,这会引发错误:
我想我不明白在这种情况下如何进行改进。但是有没有办法实现这样的目标?
ruby - 对块应用细化
假设我正在设计一种特定领域的语言。对于这个简化的示例,我们有变量、数字以及将事物相加的能力(变量或数字)
现在,如果我想表示表达式x + 1
,我写Addition.new(Variable.new('x'), 1)
。
我们可以通过提供一个+
on 方法来使这更方便Variable
。
然后我们就可以写了Variable.new('x') + 1
。
但是现在,假设我想要相反的结果:1 + x
. 显然,我不想猴子补丁Integer#+
,因为这会永久禁用普通的 Ruby 整数加法。我认为这将是一个很好的改进用例。
具体来说,我想定义一个方法expr
,它接受一个块并在+
重新定义的上下文中评估该块以构造我的 DSL 的实例。也就是说,我想要类似的东西
因此,理想情况下,expr { 1 + Variable.new('x') }
将导致 DSL 表达式Addition.new(1, Variable.new('x'))
。
然而,Ruby 的细化似乎是非常善变的,并且module_eval
' 进入具有活动细化的范围并不会像我希望的那样激活块内的细化。有没有办法使用module_eval
,instance_eval
等来激活特定 Ruby 块内的细化?
我意识到我可以将整数包装在一个IntegerExpr
类中并提供+
它。然而,这是 Ruby,元编程的极限是天空,所以我很好奇它是否可以用普通的 RubyInteger
实例来完成。我想定义一个方法expr
,这样,在
+
块内部是一个细化定义的,Integer#+
即使该细化在 的调用站点上未激活expr
。这可能吗?
ruby - 动态调度会降低圈复杂度吗?
想象一下以下将布尔值转换为 int 的方法:
由于有条件,圈复杂度得分为 2。通过使用 Ruby 中的改进,分数会降到 1 吗?:
换句话说; 动态调度会降低圈复杂度分数,还是我们只是通过让 Ruby 做“繁重的工作”来隐藏复杂性?