class Country < ActiveRecord::Base
#alias_method :name, :langEN # here fails
#alias_method :name=, :langEN=
#attr_accessible :name
def name; langEN end # here works
end
Run Code Online (Sandbox Code Playgroud)
在第一次呼叫alias_method失败时:
NameError: undefined method `langEN' for class `Country'
Run Code Online (Sandbox Code Playgroud)
我的意思是,当我这样做时,它失败了Country.first.
但是在控制台中我可以Country.first.langEN成功调用,并看到第二个调用也可以.
我错过了什么?
ruby activerecord ruby-on-rails alias-method rails-activerecord
考虑以下类:
class Foo
def an_inst_method
'instance method'
end
def self.a_class_method
'class method'
end
alias_method :a_new_inst_method, :an_inst_method
end
Run Code Online (Sandbox Code Playgroud)
这没有问题,您可以毫无问题地拨打电话Foo.new.a_new_inst_method。
我希望能够拥有一个类方法Foo.add_widget(*items)和别名,以便我可以执行以下操作:
Foo.add_widget 'item1'
Foo.add_widgets 'item2', 'item3'
Run Code Online (Sandbox Code Playgroud)
所以本质上它有一个“红宝石风格” 1.minute,2.minutes所以我想别名一个Foo.add_widgetso 调用Foo.add_widgets调用完全相同的方法。我知道我可以包装它,但我觉得我应该能够以更清洁的方式做到这一点。
考虑我尝试这样的事情的尝试:
class Foo
def an_inst_method
'instance method'
end
def self.a_class_method
'class method'
end
alias_method :a_new_inst_method, :an_inst_method
alias_method :a_new_class_method, :a_class_method
end
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
NameError (undefined method `a_class_method' for class `Foo')
Run Code Online (Sandbox Code Playgroud)
所以看起来这不适用于类方法。我该怎么做?
当通过创建的方法调用时alias_method,__callee__忽略旧方法的名称(此处xxx)并返回新方法的名称,如下所示:
class Foo
def xxx() __callee__ end
alias_method :foo, :xxx
end
Foo.new.foo # => :foo
Run Code Online (Sandbox Code Playgroud)
即使xxx从超类继承,此行为仍然成立:
class Sup
def xxx() __callee__ end
end
class Bar < Sup
alias_method :bar, :xxx
end
Bar.new.bar # => :bar
Run Code Online (Sandbox Code Playgroud)
考虑到上述两种情况,我希望xxx通过模块包含相同的行为.但事实并非如此:
module Mod
def xxx() __callee__ end
end
class Baz
include Mod
alias_method :baz, :xxx
end
Baz.new.baz # => :xxx
Run Code Online (Sandbox Code Playgroud)
我希望返回值:baz不是:xxx.
上面的代码是使用Ruby 2.3.1p112执行的.这是执行中的错误__callee__吗?或者也许是alias_method?如果没有,有人可以解释为什么模块包含行为不同吗?
更新1
我一直在尝试修改全局缓存模块,但我无法弄清楚为什么这不起作用.
有没有人有什么建议?
这是错误:
NameError: undefined method `get' for module `Cache'
from (irb):21:in `alias_method'
Run Code Online (Sandbox Code Playgroud)
...由此代码生成:
module Cache
def self.get
puts "original"
end
end
module Cache
def self.get_modified
puts "New get"
end
end
def peek_a_boo
Cache.module_eval do
# make :get_not_modified
alias_method :get_not_modified, :get
alias_method :get, :get_modified
end
Cache.get
Cache.module_eval do
alias_method :get, :get_not_modified
end
end
# test first round
peek_a_boo
# test second round
peek_a_boo
Run Code Online (Sandbox Code Playgroud) 在单元测试中,我需要测试alias_method定义的别名方法是否已正确定义.我可以简单地对用于原始的别名使用相同的测试,但我想知道是否有更明确或有效的解决方案.例如,有没有办法1)取消引用方法别名并返回其原始名称,2)获取并比较某种基础方法标识符或地址,或3)获取和比较方法定义?例如:
class MyClass
def foo
# do something
end
alias_method :bar, :foo
end
describe MyClass do
it "method bar should be an alias for method foo" do
m = MyClass.new
# ??? identity(m.bar).should == identity(m.foo) ???
end
end
Run Code Online (Sandbox Code Playgroud)
建议?
我希望为一个原始方法添加两个别名,但我没有看到alias_method一次执行多个别名的能力,而是一个接一个.
那么是否有可能改变这种情况:
alias_method :aliased_first_method, :first_method
alias_method :aliased_first_method?, :first_method
Run Code Online (Sandbox Code Playgroud)
这样的事情:
alias_method [:aliased_first_method, :aliased_first_method?], :first_method
Run Code Online (Sandbox Code Playgroud)
我对创建自定义方法不感兴趣.
我正在处理我的Web应用程序,我想覆盖一个方法,例如,如果原始类是
class A
def foo
'original'
end
end
Run Code Online (Sandbox Code Playgroud)
我想覆盖foo方法,它可以这样做
class A
alias_method :old_foo, :foo
def foo
old_foo + ' and another foo'
end
end
Run Code Online (Sandbox Code Playgroud)
我可以像这样调用新旧方法
obj = A.new
obj.foo #=> 'original and another foo'
obj.old_foo #=> 'original'
Run Code Online (Sandbox Code Playgroud)
那么如果我可以像我一样访问并保留两种方法,那么alias_method_chain的用途是什么?
ruby ruby-on-rails alias-method-chain alias-method ruby-on-rails-3
假设我有一段Ruby代码,我想在其中添加一个方法(我不知道为什么;让我假设我有充分的理由).
class String
alias_method :contains?, :include?
end
Run Code Online (Sandbox Code Playgroud)
在本节之后,我可以删除这个别名吗?
在JavaScript中,如何创建一个与现有函数同名的新函数,同时还保留原始函数,以便可以从新函数中调用它?
我有一个公开两种接口方法的类client_options和user_options,在这个级别的祖先,它们相当于default_options.我不希望其他开发人员default_options直接实现,因此它是私有的.
class Foo
def client_options
default_options
end
def user_options
default_options
end
private
def default_options
{ foo: :bar }
end
end
Run Code Online (Sandbox Code Playgroud)
为了保存一些代码行,我想对方法进行别名:
class Foo
alias_method :client_options, :default_options
alias_method :user_options, :default_options
private
def default_options
{ foo: :bar }
end
end
Run Code Online (Sandbox Code Playgroud)
但alias_method只是别名公共方法.
我在这个博客上找到了如何为私有方法添加别名:
class Foo
def default_options
{ foo: :bar}
end
private :default_options
alias_method :client_options, :default_options
public :client_options
end
Run Code Online (Sandbox Code Playgroud)
但是,它有点难以理解.
是否有更直接的解决方法来为私有方法添加别名?