如何根据方法名称动态调用方法? [复制]

2024-01-19

当方法的名称包含在字符串变量中时,如何动态调用该方法?例如:

class MyClass
  def foo; end
  def bar; end
end

obj = MyClass.new
str = get_data_from_user  # e.g. `gets`, `params`, DB access, etc.
str  #=> "foo"
# somehow call `foo` on `obj` using the value in `str`.

我怎样才能做到这一点?这样做是否存在安全风险?


你想做的事情叫做动态调度 https://en.wikipedia.org/wiki/Dynamic_dispatch。在 Ruby 中非常简单,只需使用public_send http://ruby-doc.org/core/Object.html#method-i-public_send:

method_name = 'foobar'
obj.public_send(method_name) if obj.respond_to? method_name

如果该方法是私有/受保护的,请使用send http://ruby-doc.org/core/Object.html#method-i-send相反,但更喜欢public_send.

如果值method_name来自用户。为了防止漏洞,您应该验证哪些方法可以实际调用。例如:

if obj.respond_to?(method_name) && %w[foo bar].include?(method_name)
  obj.send(method_name)
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据方法名称动态调用方法? [复制] 的相关文章

  • Ruby 中多维数组的帮助

    我有以下代码将字符串拆分为 3 个字节的组 str hello ix 0 iy 0 bytes tby str each byte do c if iy 3 iy 0 bytes ix tby each index do i bytes i
  • 红宝石边缘情况

    ruby 有一些边缘情况很难解释 因为解析会带来一些有趣的问题 我在这里列出其中两个 如果您知道更多 请添加到列表中 def foo 5 end this one works if tmp foo puts tmp to s end How
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • Watir 更改 Mozilla Firefox 首选项

    我正在使用 Watir 运行 Ruby 脚本来自动执行一些操作 我正在尝试自动将一些文件保存到某个目录 因此 在我的 Mozilla 设置中 我将默认下载目录设置为桌面并选择自动保存文件 然而 当我开始运行脚本时 这些更改并未反映出来 似乎
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • 如何使用本地安装的gems执行Ruby程序?

    我已经使用安装了我的依赖项 bundle package 然后将它们传输到离线服务器并运行 gt bundle install local Using mime types 1 19 Using rest client 1 6 7 Usin
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • “rmagick”gem 安装问题

    我在尝试在 centos 上安装 rmagick gem 时遇到问题 以下是我得到的输出 谁能帮我识别一下我缺少什么包裹 我已经安装了所有提到的另一个堆栈溢出线程 RMagick安装错误 https stackoverflow com qu
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • 已定义方法的 Ruby 钩子?

    我一直在谷歌上搜索这个问题 但找不到答案 这让我认为答案是否定的 但我想我会在这里问 以防有人确切知道 Ruby 是否有一个钩子来定义方法 即在模块或类上 如果没有 是否有人足够熟悉该实施的情况main对象以了解它到底如何将方法复制到Obj
  • D 动态数组初始化、stride和索引操作

    抱歉 这成为了有关数组的三重问题 我认为 动态 数组在 D 中确实很强大 但以下问题已经困扰我一段时间了 在 C 中 我可以轻松地分配具有指定值的数组 但在 D 中 我还没有找到这样做的方法 当然下面的内容是没有问题的 int a new
  • 在 Ruby 中创建一个空文件:相当于“touch”?

    创建一个的最佳方式是什么emptyRuby 中的文件 类似于 Unix 命令的东西 touch https en wikipedia org wiki Touch 28Unix 29 touch file txt FileUtils tou
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 如何使用 net/http 验证 ruby​​ 中的 SSL 证书链

    我如何验证网站的证书 例如https processing ukash com https processing ukash com 在 ruby 中使用 net http https Net HTTP new processing uka
  • Ruby 中的 DateTime.parse() 是否依赖于语言环境?

    我想知道以下示例的输出 解析时01 03 它会被解决为Mar 1st or Jan 3rd Ruby 不依赖于语言环境 因为红宝石是一个服务器端语言而不是客户端像 JavaScript 一样的语言 Ruby 使用系统时钟yourWeb 应用
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • Watir Webdriver 加载 Chrome 扩展

    我正在尝试使用 Watir 加载 chrome 扩展 但遇到了问题 我发现这个相关问题 能够启动带有 watir webdriver 加载扩展的 chrome https stackoverflow com questions 125867

随机推荐

  • 如果嵌入需要正确的大括号嵌套,如何在 Ace 编辑器中进行嵌入突出显示?

    考虑以下 Razor 代码 div Model GetSomething div 显然 只有考虑到所有括号 才能正确识别 Razor 块 如果我进行朴素嵌入 基于 PHP 的做法 var RazorLangHighlightRules fu
  • 在 GGplot2 中使用 Geom_Bar

    So I m trying to use geom bar in ggplot2 and all of the cases that I see of people demonstrating it online are of compar
  • C# - C 互操作性

    问答位于链接文本 https stackoverflow com questions 3726829 writing a dll in c c for net interoperability非常接近我正在寻找的内容 但我刚刚开始使用 C
  • 电子邮件中的图像:链接还是嵌入?

    我注意到我收到的几乎所有电子邮件都没有嵌入图像 而是从 http 链接它们 当然它们会被默认阻止 我正在为我的服务发送 HTML 电子邮件 并且可以轻松嵌入图像以创建更好的视觉体验 有什么特别的理由不这样做吗 为什么其他人都使用链接而不是嵌
  • `##` 和 `hashCode` 有什么区别?

    方法之间有什么区别 and hashCode 无论哪个类别或哪个类别 它们似乎都输出相同的值hashCode我使用的超载 谷歌也没有帮助 因为它找不到符号 的 子类 AnyVal不守规矩properly从哈希的角度来看 scala gt 1
  • UNIX下如何查看进程是否挂起

    我正在尝试恢复所有已暂停的进程 但我不知道如何检查进程是否已暂停 我尝试过 但它没有表明该进程是暂停还是运行 你可以使用 Ipor 的方式 proc
  • 使用滚动条动态显示面板的布局

    在java中 我一直在尝试创建一个可以接受其他带有滚动条的面板的面板 我尝试使用网格布局 这工作得很好 除了如果我只添加几个面板 它会增长这些面板以适应父面板的大小 我尝试使用 flowlayout 但这使得面板水平流动 因为有滚动条 我该
  • 你能给我指一个大型 Python 开源项目吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想看看用 Python 完成的大型 gt 40 名开发人员 项目是什么样子的 代码是什么样子的 他们使
  • 有没有办法优化std算法?

    搜索有关标准算法性能的任何信息 我发现堆栈溢出问题 https stackoverflow com questions 25622109 why is c stdmax element so slow关于之间的性能差异std max ele
  • C# 垃圾收集

    假设我们有 public void foo someRefType test new someRefType test new someRefType 垃圾收集器对第一个堆对象做什么 在新分配之前是否立即进行垃圾收集 一般机制是什么 垃圾收
  • 如何在 Android Wear 上录制音频

    有什么方法可以在 Android Wear 上录制音频吗 我使用 AudioRecord API 它使应用程序崩溃 难道我做错了什么 short audioData new short minBufferSize AudioRecord a
  • .NetCoreApp 和 .NetStandard.Library 有什么区别?

    Net Core 1 0 几天前发布了 我已经开始使用它了 我创建了一个简单的解决方案 其中一个项目 类库 gt NetStandard Library 和第二个项目是控制台应用程序 NetCoreApp 关键是 控制台应用程序引用了库 但
  • 如何使 UITextField 只有一个文本/数字并使用“下一步/完成”按钮浏览多个“UITextField”

    我必须处理多个导航UITextField使用 下一步 完成按钮 现在我必须在每个按钮中只允许一个文本 数字UITextField我们怎样才能做到这一点UITextField如下图所示 我最近使用了以下代码 也能够实现 但遇到问题 当我第一次
  • 构建失败 jenkins iOS 没有错误

    我让 jenkins 工作来编译 iOS 应用程序 但我的构建失败了 没有错误 CodeSign Users jenkins Library Developer Xcode DerivedData XXXXX com aevqskpxrxf
  • 我可以在 Razor 中使用 @helper 语法返回字符串吗?

    我有一个 RazorHelpers cshtml 文件app code看起来像 using Molecular AdidasCoach Library GlobalConstants helper Translate string key
  • 将工具提示与 Windows 应用程序中的 CHM 帮助集成

    我们正在尝试重新设计 Windows 桌面应用程序的文档流程 我们的两个要求是 以 CHM 格式提供 参考 帮助 提供有关各个控件的工具提示帮助 目前我们的工具提示被硬编码到 Delphi C Builder 表单中 但我理想情况下希望避免
  • libVLC 函数 media_player_new() 抛出分段错误

    media player new 抛出分段错误 import vlc ins vlc Instance player ins media player new 这是它崩溃的地方 Thread 0 Crashed Dispatch queue
  • scala:为什么 1/0 是算术异常但 1.0/0.0 = Double.Infinity

    在 Scala 中 整数算术除以零会抛出 a 这似乎不一致java lang ArithmeticException by zero 但是浮点运算 1 0 0 0 返回Double Infinity 我知道从类型的角度来看 同时拥有 Dou
  • 默认函数参数的有效表达式

    函数或成员函数中默认参数的有效表达式有哪些可能类型 在对函数参数类型的变量进行赋值的上下文中任何正确的内容 Edit编译期间的默认参数根据类型正确性等进行评估 但不会计算它们 并且直到运行时才会进行赋值 您可以将尚未定义的类的构造函数指定为
  • 如何根据方法名称动态调用方法? [复制]

    这个问题在这里已经有答案了 当方法的名称包含在字符串变量中时 如何动态调用该方法 例如 class MyClass def foo end def bar end end obj MyClass new str get data from