问题标签 [class-eval]

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 回答
673 浏览

ruby - 在 ruby​​ 中已经定义的类之后定义类的实例方法

在将单独的模块包含到单独的类中之后,我在使用实例方法扩展类时遇到了一些问题

现在我想这样称呼这个方法:

问题当然是没有与类 eval 的 include 方法绑定,我可以保存要传递到 ActsAsCommentable 模块中的类 eval 的变量,但我不想这样做。有没有更好的办法?

我试着做

但是正如我猜想的那样,这会为类的单音对象创建实例方法,因此我只能通过

再说一次,没有约束力...

0 投票
1 回答
502 浏览

ruby - module_eval / class_eval / instance_eval 如何计算行号

我发现传递给 的 line_numberclass_evalmodule_eval错误instance_eval报告的行号不匹配。ruby-doc没有解释这种行为, 它说:(instance_eval用作示例)

可选的第二个和第三个参数提供报告编译错误时使用的文件名和起始行号。

所有这三个方法class_evalmodule_evalinstance_eval接受两个额外的参数来指定文件名和 lineno 参数设置错误消息的文本。

这个问题有一个关于这种行为的实际演示。

但是,我发现行号的计算比解释更复杂。这是一个演示

上面的代码证明line_no传递给的参数instance_eval不是报错的行号,而只是与line_no.

我想知道这个参数的确切行为?

0 投票
1 回答
544 浏览

ruby-on-rails - nil:NilClass 的未定义方法‘association_class’

我正在使用 Spree 2.1 并尝试添加新的支付网关,但这个错误更普遍,所以 Spree 本身在这里并不那么重要。

undefined method 'association_class' for nil:NilClass在将一些模块添加到Spree::PaymentMethod)类后,我遇到了该错误( ):

spree/payment_method_decorator.rb

Spree::Core::CalculatedAdjustments 来源

Spree::Gateway 来源

不幸的是,现在Spree::PaymentMethodsource)有点中断,即:

有谁知道为什么会发生这种情况以及如何解决它?

事实上,我已经有了答案(经过几个小时的努力),但也许有人会给出一个更好的答案,并给出适当的解释。也许答案很明显,但它不适合我,我找不到任何与 SO 相关的东西,所以希望其他具有类似 RoR 知识水平的人不必再花几个小时在这上面。

0 投票
1 回答
274 浏览

ruby - 使用 define_method 和 eval 的动态方法

我已经将两个以几种不同方式实现的示例类放在一起,它们很好地反映了我想要在我的 Rails 模型中做的事情。我担心的是,我不知道使用这两种方法有什么问题(如果有的话)。而且我只找到了解释如何实施它们的帖子或使用它们时要避免/小心的一般警告。我还没有找到关于如何安全地完成此操作的清晰解释,以及我要注意什么或为什么我应该避免这种模式。

0 投票
0 回答
626 浏览

ruby - 带有自定义定义上下文的 instance_eval

我试图为已经存在的库创建 DSL 定制,但我对 Ruby 块上下文有一些误解。

假设我们有一个块保存为 proc

当我们简单地产生一个块时,这个块的自身上下文不会改变

当我们打电话

此块中的 self 变为 N,默认定义保持不变

当我们在实例上调用 instance_eval

some_block 中的 self 上下文切换到 N 个实例,但默认定义者变为 N 个实例元类

是否有任何方便的方法可以在其他地方的实例和代理定义上下文中产生块?

例如,我有 Delegator 实例,其中包含一些类,我想将定义上下文代理到它:

所以 Definee 已经实现了 DSL,我用 instance_eval 覆盖了它,但是定义上下文不正确。Class_eval 将被委托给 Definee,并且不会调用 MyDelegator 的任何方法,因此它也不能解决问题。

也许有一些更优雅的方式来做这样的事情。有任何想法吗?

编辑:

使用从 Module 继承的类作为委托人解决了我的定义上下文切换问题。

0 投票
1 回答
274 浏览

ruby-on-rails - 输入意外结束?

在下面的代码中,我遇到了一个错误,syntax error, unexpected '\n', expecting :: or '[' or '.' (SyntaxError)但我看不出问题出在哪里。

我用class_eval错了吗?

0 投票
2 回答
344 浏览

ruby-on-rails - 尝试重新打开引擎类时的循环依赖?

我正在尝试在 Rails 中重新打开一个来自引擎的类。我做了以下事情:

它位于:

这一切都在我的应用程序中,然后应该让我运行:

但是,当我这样做时,我得到了错误:

0 投票
1 回答
55 浏览

ruby - 在类定义中的方法名称中显式使用“self”

这段代码来自 Rails Crash Course 书:

这个想法是,一个子类Accessor可以通过调用accessor具有我们希望为其生成 getter 和 setter 方法的属性名称的方法来创建 getter 和 setter 方法:

但是,为什么要使用selfin def self.accessor(attr)

0 投票
0 回答
143 浏览

ruby-on-rails - Rails Spree Extension 不在视图中显示实例

默认的 Spree Commerce 具有“类别”和“品牌”分类。我已经生成了一个扩展,它创建了一个自定义测试页面,其中显示了分类法,但顺序相反。这仅用于练习目的。

自定义测试页面“/testing”似乎正确路由并使用视图testing.html.erb,但我无法加载方法中定义的分类法实例。它给了我一个undefined method each for nil:NilClass.

注意:我只在扩展程序中工作,而不是在 spree 应用程序中工作。

spree_custom_extension/controllers/spree/home_controller_extension.rb

spree_custom_extension/views/spree/home/testing.html.erb

spree_custom_extension/config/routes.rb

0 投票
1 回答
152 浏览

ruby-on-rails - 为什么在重新打开课程时有时会使用 class_eval 可以工作?

我在 Rails 应用程序中遇到了一些代码,形式为

我想知道为什么他们不只是这样做

class_eval当您不想将任何内容传递给新代码时,使用是否有任何优势?