如果我有一个名为Node的ruby类:
class Node
attr_accessor :a, :b, :c
attr_reader :key
def initialize(key)
@key = key
end
def [](letter)
if letter == 'a'
return self.a
elsif letter == 'b'
return self.b
elsif letter == 'c'
return self.c
end
end
end
如何优化def [](letter)
以便我不会重复代码?更具体地说,如何使用相应的字符串访问对象的属性(即红宝石符号:a
,:b
或:c
)?
答案 0 :(得分:2)
您可以使用send
,它会在调用方上动态调用方法,在本例中为self
:
class Node
def [](key)
key = key.to_sym
send(key) if respond_to?(key)
end
end
请注意,我们在调用之前检查self
是否具有适当的方法。这样可以避免获得NoMethodError
而导致node_instance[:banana]
返回nil
,这在接口处是合适的。
顺便说一句,如果这是Node
类的大多数行为,您可能只想使用OpenStruct:
require 'ostruct'
node_instance = OpenStruct.new(a: 'Apple', b: 'Banana')
node_instance.a #=> 'Apple'
node_instance['b'] #=> 'Banana'
node_instance.c = 'Chocolate'
node_instance[:c] #=> 'Chocolate'