在Ruby中这样做的正确方法是什么?
def callOrElse(obj, method, default)
if obj.respond_to?(method)
obj.__send__(method)
else
default
end
end
答案 0 :(得分:4)
因为它没有作为答案提供:
result = obj.method rescue default
与@slhck一样,当我知道obj不会对方法做出反应时,我可能不会使用它,但这是一个选项。
答案 1 :(得分:3)
所以你想要类似于x = obj.method || default
的东西? Ruby是构建自己的自下而上构造的理想语言:
class Object
def try_method(name, *args, &block)
self.respond_to?(name) ? self.send(name, *args, &block) : nil
end
end
p "Hello".try_method(:downcase) || "default" # "hello"
p "hello".try_method(:not_existing) || "default" # "default"
也许你不喜欢这种带符号的间接调用?没问题,然后查看Ick的maybe
样式并使用代理对象(你可以弄清楚实现):
p "hello".maybe_has_method.not_existing || "default" # "default"
旁注:我不是OOP专家,但我的理解是你应该事先知道你所呼叫的对象是否确实有这样的方法。或者nil
您要控制的对象不发送方法?在这种情况下,Ick已经是一个很好的解决方案:object_or_nil.maybe.method || default
答案 2 :(得分:2)
我可能会去
obj.respond_to?(method) ? obj.__send__(method) : default
答案 3 :(得分:-1)
您可以执行以下操作:
from sphfile import SPHFile
dialects_path = "./TIMIT/TRAIN/"
for dialect in dialects:
dialect_path = dialects_path + dialect
speakers = os.listdir(path = dialect_path)
for speaker in speakers:
speaker_path = os.path.join(dialect_path,speaker)
speaker_recordings = os.listdir(path = speaker_path)
wav_files = glob.glob(speaker_path + '/*.WAV')
for wav_file in wav_files:
sph = SPHFile(wav_file)
txt_file = ""
txt_file = wav_file[:-3] + "TXT"
f = open(txt_file,'r')
for line in f:
words = line.split(" ")
start_time = (int(words[0])/16000)
end_time = (int(words[1])/16000)
print("writing file ", wav_file)
sph.write_wav(wav_file.replace(".WAV",".wav"),start_time,end_time)
“&”在这里充当Maybe。也许有东西,也许没有。当然,如果没有,它只会返回nil并且不会运行其后的方法。