标签: alias-method

为什么alias_method在Rails模型中失败

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

24
推荐指数
1
解决办法
8605
查看次数

类方法是否有 alias_method ?

考虑以下类:

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.minute2.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)

所以看起来这不适用于类方法。我该怎么做?

ruby alias-method

15
推荐指数
3
解决办法
512
查看次数

包含模块时__callee__的意外值 - 这是一个Ruby错误吗?

当通过创建的方法调用时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

我已将此发布到Ruby bug跟踪器 …

ruby inheritance metaprogramming alias-method

14
推荐指数
1
解决办法
199
查看次数

alias_method和class_methods不混用?

我一直在尝试修改全局缓存模块,但我无法弄清楚为什么这不起作用.

有没有人有什么建议?

这是错误:

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)

ruby metaprogramming alias-method

13
推荐指数
1
解决办法
5907
查看次数

是否有一种优雅的方法来测试一个实例方法是否是另一个实例的别名?

在单元测试中,我需要测试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)

建议?

ruby reflection alias-method

11
推荐指数
1
解决办法
1655
查看次数

多次别名一个方法

我希望为一个原始方法添加两个别名,但我没有看到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)

我对创建自定义方法不感兴趣.

ruby alias-method

9
推荐指数
1
解决办法
4295
查看次数

alias_method和alias_method_chain有什么区别?

我正在处理我的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

7
推荐指数
1
解决办法
497
查看次数

我可以删除Ruby中的方法别名吗?

假设我有一段Ruby代码,我想在其中添加一个方法(我不知道为什么;让我假设我有充分的理由).

class String
    alias_method :contains?, :include?
end
Run Code Online (Sandbox Code Playgroud)

在本节之后,我可以删除这个别名吗?

ruby metaprogramming alias-method

5
推荐指数
2
解决办法
1912
查看次数

JavaScript中的别名方法链?

在JavaScript中,如何创建一个与现有函数同名的新函数,同时还保留原始函数,以便可以从新函数中调用它?

javascript alias-method

3
推荐指数
1
解决办法
1088
查看次数

`alias_method`是一种私有方法

我有一个公开两种接口方法的类client_optionsuser_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)

但是,它有点难以理解.

是否有更直接的解决方法来为私有方法添加别名?

ruby alias-method

2
推荐指数
1
解决办法
2609
查看次数