ruby-method_missing 返回无方法错误

2024-02-03

我正在尝试使用 method_missing 将美元转换为不同的货币。

class Numeric
    @@currency={"euro"=>2, "yen"=>6}
    def method_missing(method_id,*args,&block)
        method_id.to_s.gsub!(/s$/,'') #get rid of s in order to handle "euros"
        @@currency.has_key?(method_id) ? self*@@currency[method_id] : super             
    end
end

> 3.euro   #expect to return 6
NoMethodError: undefined method 'euro' for 3:Fixnum
from (pry):24:in 'method_missing'

> 3.euros  #expect to return 6
NoMethodError: undefined method 'euros' for 3:Fixnum
from (pry):24:in 'method_missing'

I guess 3.euro不工作,因为:euro.to_s.gsub!(/s$/,'')回报nil。我不确定为什么它不返回任何方法错误。

谢谢你的帮助。


When 方法缺失将被调用,然后euro将被分配给method_id as a symbol。但你的@@currencyhash 将所有键保存为字符串,您需要将它们转换为symbols.

method_id.to_s.gsub!(/s$/,'')没有办法改变实际的对象method_id。因为method_id.to_s会给你一个新的string对象,以及#gsub!只会致力于此。你不可能改变method_id,它保持原样。更好用non-bang一,因为如果没有进行任何更改,它会给您实际的对象,或者如果发生更改,则更改对象,那么您需要将此返回值分配给一个新变量。

和你的@@currency, @@currency.has_key?(method_id)评价为false and super class method_missing已被调用。为什么?作为method_id没有转换成字符串,这可能会发生您期望的情况。

但是,如果您想对两者都做出回应,例如euro or euros, then

class Numeric
    @@currency={"euro" => 2, "yen" => 6}
    def method_missing(method_id,*args,&block)
        #get rid of s in order to handle "euros"
        new_method_id = method_id.to_s.gsub(/s$/,'') 
        @@currency.has_key?(new_method_id) ? self*@@currency[new_method_id] : super             
    end
end

3.euros # => 6
3.euro  # => 6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruby-method_missing 返回无方法错误 的相关文章

随机推荐

  • 如何禁用 iPhone 上文本输入的拼写检查器

    有时拼写检查器是不必要的 验证码 用户名 电子邮件等 有没有办法在某些文本输入 文本区域禁用它 正如我的好友 Jonathan Stark 所指出的 您应该能够使用自动更正和自动完成等属性来实现您正在寻找的效果
  • 自动对齐双语 Rmarkdown -> LaTeX 文档的文本

    更新 见下文 我正在写一份双语报告 即使用阿拉伯语和英语 使用xelatex引擎 mainfont Arial and lang arYAML 元数据 该文档可以顺利渲染阿拉伯语和英语 经过一段时间后 hustle https stacko
  • Android获取以编程方式创建的视图的宽度

    我以编程方式创建了 TextView 如下所示 TextView mTextView new TextView getApplicationContext final LayoutParams params new TableLayout
  • WPF ListView ScrollBar 可见为 false

    即使需要 是否可以强制水平 或垂直 滚动不显示 问题是我需要根据项目显示不同的颜色 效果很好 但您可以清楚地看到颜色没有到达列表视图的两个边缘 这有点难看 更糟糕的是 我的列表视图中有另一个列表视图 其中包含另一个项目列表 这些项目的背景甚
  • Firefox 中背景图像的过渡?

    我正在尝试为此寻找替代方案 transition background image 1s whatever in firefox因为它只适用于 webkit 浏览器 我已经尝试过不透明度替代方案 但这对我来说不是一个选择 因为我在背景容器上
  • git - 无法拉取或提交

    我在提交和拉取时遇到问题 在提交 IDE 中我看到 warning not all local changes may be shown due to an error unable to read tree 并且只有我的文件提交的一部分在
  • 我可以在我不拥有的类型上使用 DebuggerTypeProxyAttribute 之类的东西吗?

    我有一个IClaimsPrincipal变量 我想看看其中有多少索赔 在监视窗口中导航属性很复杂 因此我想自定义该对象的显示方式 我知道 DebuggerTypeProxy 属性 http msdn microsoft com en us
  • jQuery 美元符号混淆

    我对 jQuery 中的美元符号有点困惑 希望有人能帮助我 我有以下函数声明 function create discussion button click function alert Clicked listitems tr click
  • PHP 的 Curl 无法在 AppEngine 上运行

    在本地 AppEngine 上 curl 请求给出以下结果 这正是我所期望的 url gt https spreadsheets google com feeds spreadsheets private full content type
  • 定时器触发不会触发队列但手动录入会触发-Python

    我有一个队列触发器 当消息手动添加到队列中时 它会启动并按预期运行 但是 当消息通过以下定时器触发函数写入队列时 它无法启动 我可以看到触发器已成功写入消息 init py import datetime import logging im
  • 在 HTTPServlet 请求中编码 UTF-8

    这可能看起来像是一个已经解决的问题 但事实并非如此 因为我已经解决了所有涉及 UTF 8 的问题 但没有一个解决方案对我有帮助 我使用 JSON 简单库向包含 JSON 对象的 java servlet 发送 http 请求 我在Tomca
  • 如何同时针对多种类型专门化方法

    我有这样的代码 template lt class T gt struct Value quite a lot of other functions which I do not want to specialize too void pr
  • LINQ 使用 OR 连接

    我想使用 OR 语句与 LINQ 进行 JOIN 这是我开始的 SQL 查询 SELECT t id FROM Teams t INNER JOIN Games g ON g homeTeamId t id OR g awayTeamId
  • 如何跟踪 WinForms 中任何子控件何时获得或失去焦点?

    我有一个 Windows 窗体自定义控件 其作用类似于面板 因为它可以包含任意数量的子项 子控件的数量和类型是在运行时确定的 因此我需要以通用方式工作 而不知道可能存在或不存在的确切子控件 我想根据面板是否包含焦点来更改面板的背景颜色 因此
  • 在视图导出中获取摘要计数?

    我需要将视图导出到 Excel 我已经在某处找到了一些代码 它在 xpages 中运行得很好 现在用户想要添加总计摘要 我会解释 我有一个包含用户名 项目 ID 和设备 ID 的文档 我需要做的是导出具有特定项目 ID 的所有文档 在导出中
  • 如何在 C# 中更新查询字符串?

    网址中的某处有一个 sortBy 6 如何在单击按钮时将其更新为 sortBy 4 或 sortBy 2 我是否需要编写自定义字符串函数来创建正确的重定向 URL 如果我只需要附加一个查询字符串变量我会这样做 string complete
  • 使用此椭圆曲线点乘法计算的点不在曲线上,此类带来算术异常

    我得到了使用标准投影坐标进行点乘错误的堆栈 我不知道我错过了什么 但相乘的点并不位于曲线上 有时它会输出类似的内容算术异常 整数不可逆 public class ECPointArthimetic EllipticCurve ec priv
  • 在 redhat linux 上安装 docker - 'container-selinux' 和 'selinux-policy' 问题

    我在 EC2 上有 Linux 并尝试安装 Docker 如何解决 container selinux 和 selinux policy 的问题 lsb release d Description Red Hat Enterprise Li
  • 避免 R 中的 for 循环

    我想要一些关于编写更好的 R 代码的建议 我目前在 R 中编写了一个循环 但它存在性能问题 我无法集中精力对其进行矢量化 因为输出数据帧中的每一行都依赖于较早的行 并且它们会迭代地向下流动 因此我编写了一个循环来按顺序读 写行 我的代码示例
  • ruby-method_missing 返回无方法错误

    我正在尝试使用 method missing 将美元转换为不同的货币 class Numeric currency euro gt 2 yen gt 6 def method missing method id args block met