Ruby习惯用法:方法调用或默认

时间:2011-01-30 07:45:05

标签: ruby methods default idiomatic

在Ruby中这样做的正确方法是什么?

def callOrElse(obj, method, default)
  if obj.respond_to?(method) 
     obj.__send__(method)
  else 
     default
  end
end

4 个答案:

答案 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"

也许你不喜欢这种带符号的间接调用?没问题,然后查看Ickmaybe样式并使用代理对象(你可以弄清楚实现):

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并且不会运行其后的方法。