【问题标题】:Alias a method to a single object将方法别名为单个对象
【发布时间】:2016-10-14 12:59:15
【问题描述】:

我正在尝试定义一个单例别名方法。 如:

name = 'Bob'
# I want something similar to this to work
name.define_singleton_method(:add_cuteness, :+)
name = name.add_cuteness 'by'

我确定我可以将方法对象作为第二个参数传递。

我不想这样做

name.define_singleton_method(:add_cuteness) { |val| self + val }

我想给String#+ 方法加上别名,不要使用它。 强调别名,但将实际方法对象作为第二个参数发送也很酷。

【问题讨论】:

  • 你不能 define_singleton_method 在 Integer 上它是不可变的
  • @bjhaid 是真的。我把它改成了String
  • name = 'Bob'; name.define_singleton_method(:add_cuteness, &name.method(:+)); name = name.add_cuteness 'by' #=> 'Bobby'这是你想要的吗?
  • 我知道我可以将该方法作为第二个参数发送。这很可能是我将使用的,但是我接受了@ndn 的回答,因为它使用了实际的别名和很好的解释。
  • &name.method(:+) 在技术上是不正确的,因为&to_proc 的语法糖。所以它将String#+ 转换为类似于{ |val| self + val } 的东西,这是我想要避免的。

标签: ruby singleton metaprogramming


【解决方案1】:

单例方法包含在该对象的单例类中:

class Object
  def define_singleton_alias(new_name, old_name)
    singleton_class.class_eval do
      alias_method new_name, old_name
    end
  end
end

rob = 'Rob'
bob = 'Bob'
bob.define_singleton_alias :add_cuteness, :+

bob.add_cuteness 'by' # => "Bobby"
rob.add_cuteness 'by' # => NoMethodError

Object#define_singleton_method 基本上是这样做的:

def define_singleton_method(name, &block)
  singleton_class.class_eval do
    define_method name, &block
  end
end

【讨论】:

  • 通常情况下,Module#alias_method 允许其参数是符号或字符串:bob.add_cuteness 'by' #=> "Bobby"
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 2019-08-19
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多