为什么在这个函数的字符串中找不到`“az”`?

为什么在这个函数的字符串中找不到`“az”`?

问题描述:

我想知道"a""z"在找到"a"后是否在一个字符串中。我想了解为什么这不起作用:为什么在这个函数的字符串中找不到`“az”`?

def nearby_az(string) 
    i = 0 
    while i < string.length 
    if string[i] == "a" && string[i+1] == "z" 
     return true 
    else 
     return false 
    end 
    i += 1 
    end 
end 

我意识到有一个简单的方法来实现这一点。我不在寻找另一种解决方案。

+4

什么是您可以在其中找不到“AZ”输入? –

+2

尝试“jimmaz”或“baz”或“jimmazuja” – jgozal

+3

您需要比“这不工作”更具体。当你期望'true'时,它是否返回'false',反之亦然,如果是的话,'string'的值是什么时候呢?我不相信你的代码应该引发一个异常,但是如果这是你的问题,你需要精确地说明异常是什么以及它发生了什么。你的代码非常类似于Ruby(你知道),所以在你开始工作之后,我建议你将它发布在[Code Review](http://codereview.stackexchange.com/questions/tagged/ruby)上以获得改进它的建议。 –

这段代码只会在最开始时发现“az”。否则它会return false。推迟return false,直到你走完整个琴弦。

def nearby_az(string) 

    i = 0 
    while i < string.length -1 
    return true if string[i] == "a" && string[i+1] == "z" 

    i += 1 
    end 
    # we can only reach this line if the loop above does not return. 
    # if it doesn't, then the substring we seek is not in the input. 
    return false 
end 

nearby_az('baz') # => true 
+0

啊我明白了。谢谢,我会尽快接受答案。 – jgozal

+0

就像一个笔记,你实际上不需要'return false'中的'return'。 –

+0

@JustinWood:是的,我只是移动了原来的代码,以保持相似性。此外,有助于澄清。 –

@Segio Tulentsev的答案解释了为什么你的坏了。

以下是简短的实现,如果你有兴趣

def nearby_az(str) 
    !! str =~ /a(?=z)/i 
end 
+2

是的,你也可以只返回true如果string.include? “AZ”。不幸的是,我无法实现这一点。 – jgozal

+1

我想我会看到另一个腔,这个在你的左上前臼齿。 –

+0

请注意,如果您一起寻找az,技术上za满足此要求。所以你也需要(a(?= z)| z(?= a))。如果不敏感是一个需求,你需要补充一点。 – engineerDave