"foo" 现在,回答问题:class -6ren">
gpt4 book ai didi

ruby - class << Ruby 中的 self 习语

转载 作者:数据小太阳 更新时间:2023-10-29 06:16:04 24 4
gpt4 key购买 nike

什么是class << selfRuby 中做什么?

最佳答案

首先,class << foo语法打开foo的单例类 (eigenclass)。这允许您专门化在该特定对象上调用的方法的行为。

a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"

a = 'foo' # new object, new singleton class
a.inspect # => "foo"

现在,回答问题:class << self打开self的单例类,以便可以为当前 self 重新定义方法对象(在类或模块体内是类或模块本身)。通常,这用于定义类/模块(“静态”)方法:

class String
class << self
def value_of obj
obj.to_s
end
end
end

String.value_of 42 # => "42"

这也可以简写为:

class String
def self.value_of obj
obj.to_s
end
end

或者更短:

def String.value_of obj
obj.to_s
end

在函数定义内部时,self指调用函数的对象。在这种情况下,class << self打开该对象的单例类;它的一个用途是实现穷人的状态机:

class StateMachineExample
def process obj
process_hook obj
end

private
def process_state_1 obj
# ...
class << self
alias process_hook process_state_2
end
end

def process_state_2 obj
# ...
class << self
alias process_hook process_state_1
end
end

# Set up initial state
alias process_hook process_state_1
end

因此,在上面的示例中,StateMachineExample 的每个实例有process_hook别名为 process_state_1 , 但请注意后者如何重新定义 process_hook (仅适用于 self,不影响其他 StateMachineExample 实例)至 process_state_2 .因此,每次调用者调用 process方法(调用可重新定义的 process_hook ),行为会根据它所处的状态而改变。

关于ruby - class << Ruby 中的 self 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2505067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com