ruby-on-rails - 你能覆盖 Ruby 中的别名方法吗?

标签 ruby-on-rails ruby alias

在Ruby 中,当方法被别名时,别名指向原始方法的主体。所以即使你重新定义了原来的方法,别名也会继续使用原来的定义。

class Foo
  def bar
    "bar"
  end  
  alias :saloon :bar
end

class Foo
  def bar
    "BAR"
  end
end

puts Foo.new.saloon

将返回 'bar' 而不是 'BAR'。有没有办法让沙龙使用酒吧的新定义?

编辑:我应该更清楚。该示例只是问题的说明 - 这不是我需要解决的实际问题。当您在 rails 的核心中链接别名时,问题会更加复杂。例如。 perform_action 以基准测试模块为别名,然后也以 flash 模块为别名。所以现在对 perform_action 的调用实际上是调用 perform_action_with_flash 来执行它,然后有效地调用 perform_action_with_benchmarking,然后调用原始 perform_action。如果我想覆盖 perform_action_with_benchmarking(即使我同意这是一个坏主意 - 请让我们不要讨论它,因为它不是重点),我不能,因为它已经被别名了,据我所知alias 指向的实际上是原始 perform_action_with_benchmarking 的副本,因此即使我重新定义它也没有任何效果。

最佳答案

只需重新建立别名:

class Foo
  def bar
    "bar"
  end  
  alias :saloon :bar
end

class Foo
  def bar
    "BAR"
  end
  alias :saloon :bar
end

puts Foo.new.saloon # => "BAR"

关于ruby-on-rails - 你能覆盖 Ruby 中的别名方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5905591/

相关文章:

c++ - 使用 "using"创建多个别名

git - 创建带格式的 'git log' 别名

ruby-on-rails - created_at 的 Rspec/FactoryGirl 测试顺序

ruby-on-rails - Rails link_to params .id 而不是/id

ruby-on-rails - Ruby on Rails RSpec 删除数据库

ruby-on-rails - 为什么 Rails ActionMailer 6.1/Ruby 3.0 不忽略自签名 SMTP 证书?

C++11 模板函数别名与包装器

ruby-on-rails - 不允许的参数在 rails 4.0 中向 Devise 添加新字段

mysql - OSX 10.11 El Capitan 上的 Rails : Library not loaded: libmysqlclient. 18.dylib

javascript - 将 jQuery remove() 与缓存页面一起使用(Rails 后端)