访问 Ruby 中受保护的方法

2023-12-29

我正在尝试在 Ruby 中为自己使用访问修饰符。我有:

class Person
  def initialize (first_name, last_name, age)
        @first_name=first_name
        @last_name=last_name
        @age=age
    end


    def show()
        puts @first_name
        puts @last_name
        puts @age
    end

protected
  def compare(other)
    self.instance_variable_get(:@age)<=>other.instance_variable_get(:@age)
  end

end

p1=Person.new("Some", "Body", "99")
p1.show
puts "\n"

p2=Person.new("Who", "Ever", "21")
p2.show
puts "\n"

p1.compare(p2)

我收到错误“为 # (NoMethodError) 调用了受保护的方法‘比较’” 我尝试过在班内和班外打电话。我把没有的版本粘贴在这里。我认为受保护的方法可以在同一类的其他对象上调用。这个错误是什么意思以及我如何在这里正确使用受保护的方法?感谢您的帮助。


你对这个问题的看法是错误的protected能见度。这Ruby doc http://www.ruby-doc.org/core-2.1.2/doc/syntax/modules_and_classes_rdoc.html#label-Visibility says:

第二可见性受到保护。调用受保护方法时发件人必须是接收者的子类,或者接收者必须是发送者的子类。否则将引发 NoMethodError。

所以可见性的限制适用于发件人,而不是您想象的接收器。

如果你想打电话compare在实例方法之外,您需要使用公共可见性。您需要删除protected如果可以的话修改器。这是推荐的方式。

如果代码是固定的并且您无法修改该代码段,则可以使用Object#send http://www.ruby-doc.org/core-2.1.2/Object.html#method-i-send方法。Object#send将绕过可见性约束,甚至可以访问私有方法。

p1.send(:compare, p2)

或者您可以重新打开课程并更改课程的可见性compare class:

# you code here

# reopen and modify visibility
class Person
  public :compare
end

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

访问 Ruby 中受保护的方法 的相关文章

随机推荐

  • 将一个 SwiftUI 视图从另一个视图下方滑出

    我正在尝试使用 SwiftUI 构建动画 Start A B D End A B C D 动画的关键要素是 C 应该看起来从 B 下面滑出 不是从零宽度展开 所有视图的宽度都是由子视图定义的 并且是未知的 所有子视图的宽度在动画期间或之后不
  • OSError: [Errno 8] Exec 格式错误: 在 AWS EC2 ARM 风味机中使用 Chromedriver 时出现“/home/ec2-user/Desktop/chromedriver”错误

    我有一台来自 AWS 的带有 ARM 风格的 EC2 机器 我安装了Python 3 然后使用pip3安装硒 然后我从以下位置下载了 Linux 版本的 chrome 驱动程序here https chromedriver storage
  • jQuery .load() 不适用于我的图像

    我有一些代码试图在图像加载完成后运行 我使用以下 jQuery 代码 myimageid load function alert Image Loaded 但是弹出窗口永远不会出现 我无法让 load 函数工作 有人遇到过这个问题吗 如果你
  • 从列表中删除的随机样本

    我的列表中有数据 例如 L 3 4 5 1 4 5 1 2 3 1 2 3 我需要随机采样 2 的大小 所以我想使用 import random t1 random sample set L 2 现在 T1 是随机提取的值的列表 但我想从我
  • 正确使用io包中的stdout函数

    dart 中 io 包中的 stdout 函数的正确用法是什么 我写了这样一个脚本 import dart io void main print Hello World stdout 我得到以下输出 firen firen VirtualB
  • 使用 ajax 监听器时 Primefaces 对话框框架不工作

    我正在尝试使用 Primefaces 4 对话框框架打开对话框 public void openDialog String viewName RequestContext getCurrentInstance openDialog view
  • 用GDB读取寄存器指向的内存

    如果我知道内存位置 有没有办法从 GDB 查看内存内容 也就是说 我正在调试我为操作系统课程编写的 x86 汇编程序 现在 我正在尝试使用 C 和 Gas GNU 汇编程序 为 x86 上的 Linux 编写一个用户级线程库 我分配了自己的
  • PHPStorm 中未定义的类 DateTime

    我想使用类DateTime but PHPStorm我这么说 Undefined class DateTime 我的 PHP 版本是5 5 9 1 我使用的是 PHPStorm 版本2016 1我正在与Yii2 framework 如果它能
  • 在 R 中对整齐数据同时执行多个 t.test

    我有一个如下所示的数据集 id samediff factor value 1 S give 3 1 S impact 4 2 S give 2 2 S impact 5 3 D give 1 3 D impact 4 4 D give 3
  • 如何向 Kivy For Android 添加模块?

    我在 Android 设备上安装了 Kivy 但 help modules 显示未安装 PIL 模块 我怎样才能添加它 编辑 我的意思是 我安装了 kivy launcher 并编写了一个小型测试应用程序 它可以工作 现在 如果我的应用程序
  • 当我单击 li 标签时,它会获取数据值,但是当我插入它时,它具有空值

    单击时我得到 li 标签数据值 现在我需要使用插入回数据库的值 但它在我的数据库中显示空值 但我使用 console log 它显示了价值 如何获取值并插入数据库 mymoviemanagement php movie 的值为 null i
  • 如何在 PHP 中设置 cookie 然后重定向?

    进行一些处理后 我想为用户输入设置一个 cookie 值 然后将它们重定向到新页面 但是 cookie 尚未设置 如果我注释掉重定向 则 cookie 设置成功 我认为这是某种标题问题 对于这种情况 最好的解决方法是什么 if form s
  • 不同大小类别的不同表视图单元格行高?

    如何更改此 UITableViewController 自定义类以动态更改表视图单元格的高度 我为 iPad 和 iPhone 尺寸类别指定了不同的字体大小 这是之前与 rdelmar 讨论的延续 import CREWFoodWaterL
  • 计算POST内容长度

    如何计算内容长度 例如 POST Upload HTTP 1 1 Host test lan User Agent Shockwave Flash Connection Keep Alive Cache Control no cache A
  • 操作栏抽屉切换自定义图标

    我正在尝试使用操作栏抽屉切换 但我希望它显示的不仅仅是菜单图标 我希望它在自定义菜单图标的右上角显示通知计数 但我仍然希望操作栏抽屉式开关在需要时显示后退箭头 因此 我首先尝试查看是否可以在操作栏抽屉切换上显示自定义布局 包含菜单图标的图像
  • Guid.NewGuid() VS Random.Next() 的随机字符串生成器

    我和我的同事正在讨论使用哪种方法来自动生成用户 ID 和帖子 ID 以在数据库中进行识别 一个选项使用 Random 的单个实例 并采用一些有用的参数 以便它可以重用于各种字符串生成情况 即从 4 位数字 pin 到 20 位字母数字 id
  • 如何使用JPA或HQL动态排序多对多关系?

    我有一个这样的映射 ManyToMany cascade CascadeType PERSIST JoinTable name product product catalog joinColumns JoinColumn name prod
  • 访问 Android 上先前安装创建的文件 - 范围存储 Android 11

    我正在使用 LibGDX 开发一个带有预设管理器的音乐应用程序 该管理器使用 LibGDX 的 FileHandle 来管理文件和目录 在我更新到 Android 11 API 30 之前 此功能一直运行良好 现在由于 Android 新的
  • Ruby OptionParser:隐藏命令选项的帮助文本

    Ruby OptionParser 将根据此描述自动为您生成帮助屏幕 http ruby about com od advancedruby a optionparser htm 有没有办法删除命令选项的帮助文本 我可以使用隐藏命令 而是使
  • 访问 Ruby 中受保护的方法

    我正在尝试在 Ruby 中为自己使用访问修饰符 我有 class Person def initialize first name last name age first name first name last name last nam