ruby 中的适配器模式:访问实例变量

2024-01-02

我正在学习适配器模式 https://www.sitepoint.com/using-and-testing-the-adapter-design-pattern/在红宝石中的实现。我想访问适配器模块定义中的实例变量。看一下下面的代码:

module Adapter
  module Dog
    def self.speak
      # I want to access the #name instance variable from my Animal instance
      puts "#{name} says: woof!"
    end
  end

  module Cat
    def self.speak
      # I want to access the #name instance variable from my Animal instance
      puts "#{name} says: meow!"
    end
  end
end

class Animal
  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def speak
    self.adapter.speak
  end

  def adapter
    return @adapter if @adapter
    self.adapter = :dog
    @adapter
  end

  def adapter=(adapter)
    @adapter = Adapter.const_get(adapter.to_s.capitalize)
  end
end

为了测试它,我做了以下操作:

animal = Animal.new("catdog")
animal.adapter = :cat
animal.speak

我希望它返回以下内容:

catdog says: meow!

相反,它说:

Adapter::Cat says: meow!

有关如何访问的任何提示Animal#name适配器模块的实例方法?我认为问题在于我的适配器方法是类级方法。

Thanks!


您需要将模块用作 mixin 并提供一种方法来跟踪哪个模块处于活动状态,这些方法似乎不会通过重新包含或重新扩展而被覆盖,因此我采用了我发现的扩展和删除方法here https://www.ruby-forum.com/topic/164431.

module Adapter
  module Dog
    def speak
      puts "#{name} says: woof!"
    end
  end

  module Cat
    def speak
      puts "#{name} says: meow!"
    end
  end

  def extend mod
    @ancestors ||= {}
    return if @ancestors[mod]
    mod_clone = mod.clone
    @ancestors[mod] = mod_clone
    super mod_clone
  end

  def remove mod
    mod_clone = @ancestors[mod]
    mod_clone.instance_methods.each {|m| mod_clone.module_eval {remove_method m } }
    @ancestors[mod] = nil
  end
end

class Animal
  include Adapter
  attr_accessor :name, :adapter

  def initialize(name)
    @name = name
    @adapter = Adapter::Dog
    extend Adapter::Dog
  end

  def adapter=(adapter)
    remove @adapter
    extend Adapter::const_get(adapter.capitalize)
    @adapter = Adapter.const_get(adapter.capitalize)
  end
end

animal = Animal.new("catdog")
animal.speak # catdog says: woof!
animal.adapter = :cat
animal.speak # catdog says: meow!
animal.adapter = :dog
animal.speak # catdog says: woof!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruby 中的适配器模式:访问实例变量 的相关文章

  • (在 Ruby 中)允许混合类方法访问类常量

    我有一个为其定义常量的类 然后我定义了一个类方法来访问该类常量 这很好用 一个例子 usr bin env ruby class NonInstantiableClass Const hello world class lt lt self
  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • 带有附加参数的redirect_to

    我是一个菜鸟 redirect to users url notice Succeed p p 然后我添加一个message它失败了 redirect to users url notice Succeed message test p p
  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • 两个 ruby​​ 进程之间的通信可能/容易吗?

    如果我有一个 ruby 脚本Daemon顾名思义 它作为守护进程运行 监视系统的某些部分并能够执行需要身份验证的命令 例如更改权限 是否有一种简单的方法来拥有第二个 ruby 脚本 例如client 与该脚本通信并向其发送命令 询问信息 我
  • Rspec to have(n).items undefined 方法

    我正在尝试遵循指南关于代码 tuts http code tutsplus com tutorials ruby for newbies testing with rspec net 21297我不断收到错误 这是我的库规范 require
  • 我必须使用什么加密程序来通过 HTTP 协议发送加密的“电子邮件”和“密码”值?

    我正在使用 Ruby on Rails 3 我想通过 HTTP 协议发送 电子邮件 和 密码 值 我知道 我不应该 但我需要 我需要从发送用户凭据我的客户申请到一个我的服务应用 我可以使用公共和私人RSA密钥来实现这一点 但如果是这样 我不
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid
  • Ruby 的 Faraday - 多次包含相同的参数

    我正在使用一个 API 该 API 迫使我多次发送相同的参数名称以级联不同的过滤条件 因此 示例 api GET 调用如下所示 GET http api site com search a b1 a b2 a b3 a c2 我使用 Far
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • 回形针:样式取决于模型(has_many 多态图像)

    我已将模型设置为使用多态图像模型 这工作正常 但是我想知道是否可以更改每个模型的 styles 设置 找到了一些使用 STI 模型 Art has many images as gt imageable Image belongs to i
  • 从 Jekyll 插件向页面添加属性

    假设我想要一个包含如下内容的页面 h1 page comment count Comment s h1 for c in page comment list div strong c title strong br c content di
  • Ruby 在 Windows 上找不到 sqlite3 驱动程序

    我正在尝试在 Windows 上设置 Ruby on Rails 我正在使用看起来不错的 Flash Rails 发行版 但是 sqlite3 有一个问题 我发现线程告诉我安装版本 1 2 3 安装得很好 我使用的是 ruby 1 9 0
  • 如何在 Ruby 中动态调用访问器方法[重复]

    这个问题在这里已经有答案了 不管这是否是好的做法 我如何在 Ruby 中动态调用访问器方法 这是一个示例类 class Test Class attr accessor a b end 我可以使用 Object send 方法来读取变量 i
  • 有没有办法避免自动更新 Rails 时间戳字段?

    如果您有数据库列created at and updated at当您创建和更新模型对象时 Rails 将自动设置这些值 有没有办法在不接触这些列的情况下保存模型 我正在引入一些旧数据 我想根据 不同名称的 旧数据字段中的相应值设置这些值
  • ruby中如何将binary32转换为float

    我有一个以 IEEE 32 编码的 binary32 如何将 0x0040EDC2 转换为 118 625 我尝试了几种打包和解包选项 但没有成功 IEEE http en wikipedia org wiki Single precisi
  • 未知属性:user_id

    我在执行 current user stories build 期间收到错误未知属性 user id class User lt ActiveRecord Base has many stories class name Story for
  • RSpec 2 中使用 OR 相等

    下面这个例子的正确写法是什么 玩家的分数应等于 5 或 8 it should equal 5 or 8 do player score should 5 or 8 end Thanks Tim 5 or 8将始终产生结果 5 并且不会执行
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5

随机推荐

  • 找不到 CacheableOperation[] 缓存的名为“”的缓存

    我的错误是 Exception in thread main java lang IllegalArgumentException Cannot find cache named getActionsBycasId for Cacheabl
  • Lucene 3.0.2 中的 Field.Store.COMPRESS

    我正在我的 java web 项目中将 lucene 2 4 1 升级到 3 0 2 在lucene API中我发现Field Store COMPRESS在3 0 2中不存在所以 我可以用什么来代替 Field Store COMPRES
  • 约束布局内的滚动视图不会滚动到父约束的底部

    我有一个大约有 12 13 个字段的表单 我用了一个Scrollview在约束布局内 下面是 XML 布局的层次结构 问题是 它不会滚动到底部 而是仅滚动到前 10 个视图 由于视图不再滚动 最后 3 个字段将被隐藏 家长布局
  • 在 HTML 中模拟闪烁的文本光标

    在 HTML 中插入闪烁光标 例如 DOS 中闪烁的粗下划线或 Linux 中的竖线 有什么好方法 该字符 图像将位于 H1 标题后面 并且在不同尺寸下看起来应该不错 你可以这样做CSS 这是vertical bar Fiddle http
  • 在画布上使用 D3 轴功能

    我正在尝试使用 D3 功能在画布上绘制轴 如此处所示https www tutorialsteacher com d3js axes in d3 https www tutorialsteacher com d3js axes in d3
  • Django 分页重复结果

    我在 Django 中遇到了这个奇怪的分页错误 使用object list作为视图的返回 但向其传递 paginate by 参数 它会重复一些结果 否则 如果我删除参数或设置为paginate by None 结果是正确的 如果使用分页
  • Java:如何在重写方法(祖父母方法)中调用 super().super() [重复]

    这个问题在这里已经有答案了 可能的重复 为什么是 super super method Java中不允许 https stackoverflow com questions 586363 why is super super method
  • medoo 中的 LIKE 运算符

    我该如何使用LIKE使用 medoo 框架的 sql 语句中的运算符 原始SQL语句 SELECT id name FROM table WHERE name LIKE foo 梅多声明 data db gt select table id
  • 构建sphinx文档时导入模块失败

    我在用着Sphinx版本1 4 5 我的项目结构如下 src gt main py docs generated with sphinx quickstart 即使在添加路径后src文件夹中docs conf py sys path ins
  • 检测用户何时点击 UIDatePicker 中的选择指示器?

    如何检测用户何时点击 UIDatePicker 中的选择指示器 如果没有这个 用户必须滚动到某个其他日期 然后再次返回以选择当日期选择器向上滑动时在选择指示器下显示的日期 多谢 Stine 更新 这是我自己能想到的唯一解决方案 UIDate
  • 用PHPWord将word文档解析为字符串

    我已经尝试了几种解决方案来将 Word 文档解析为 PHP 中的字符串 但是有时它们在处理某些 Word 文档时会遇到问题 所以我现在正在尝试 PHPWord 尝试将单词文档解析为字符串 我正在 PHPWord 中查看这个示例文件 它读取一
  • python中函数的均方根

    我想计算Python中函数的均方根 我的函数采用简单的形式 例如 y f x x 和 y 是数组 I tried Numpy 和 Scipy 文档 https docs scipy org doc 但什么也没找到 我假设您想要计算以下伪代码
  • 如何将字体真棒图标添加到输入类型文本中[重复]

    这个问题在这里已经有答案了 我尝试将字体很棒的图标转换为文本输入类型 但可以得到想法 但它不起作用 它将如下图所示 search location padding 9px 10px 8px 10px background fff color
  • 如何抑制 Swift 中的特定警告

    我有一个 Swift 函数 执行如下操作 func f gt Int switch WORDSIZE case 32 return 1 case 64 return 2 default return 0 Because WORDSIZE是一
  • System.Convert.ToSingle() 问题,(1.5) 与 (1,5)

    我正在用 C 编写程序来在模型格式之间进行转换 模型格式将数字作为文本 例如 0 136222 我可以使用 System Convert ToSingle 将其转换为浮点数 但在德国 我们使用逗号作为小数点 0 136222 System
  • 使用 PHPUnit 达到 100% 代码覆盖率

    我一直在为一个项目创建测试套件 虽然我意识到获得 100 的覆盖率并不the指标应该努力达到 代码覆盖率报告中有一个奇怪的地方 我想对此进行一些澄清 看截图 因为被测试方法的最后一行是return 最后一行 只是一个右括号 显示为从未执行
  • 如何从Java调用C++?

    我想从 Java 调用 C 方法 我读过有关 JNI 的内容 但我不知道如何获取所有库文件以及应该将其保存在哪里以便从命令行运行程序 有没有办法从 Eclipse 本身调用 C 方法 因为我用它来运行 Java 类 虽然我过去使用过 JNI
  • CSS div 圆角

    我正在尝试执行以下操作 这是我现在所得到的 但它没有正确渲染 有谁知道我该如何解决这个问题 CSS Curved Corners bl background url bl gif 0 100 no repeat background col
  • 在 ImageView 中翻转和更改图像

    我正在开发一个工作简单且工作效率很高的应用程序 但我有一个地方看起来不太好 那就是翻转动画 我想要的是 我有一个 Button 和按钮下方的 ImageView 单击按钮时 我想制作一个动画 看起来 ImageView 已翻转 并且下一个图
  • ruby 中的适配器模式:访问实例变量

    我正在学习适配器模式 https www sitepoint com using and testing the adapter design pattern 在红宝石中的实现 我想访问适配器模块定义中的实例变量 看一下下面的代码 modu