我正在尝试将一些代码从Python翻译成Ruby,但我仍然坚持使用python中的这一个函数:
def notNoneOf(a, b):
return a is None and b or a
我对ruby的天真翻译是这样的:
def notNoneOf(a, b):
return a.nil? and b || a
end
但这给了我一个void value expression
python代码中函数的用法如下:
for m in re.finditer('<input.*?name=(?:"([^"]*)"|([^" >]*)) value=(?:"([^"]*)"|([^" >]*))[^>]*>', data):
formData[notNoneOf(m.group(1), m.group(2))] = notNoneOf(m.group(3), m.group(4))
通过使用python REPL中的代码,看起来这个ruby代码应该可以工作:
def notNoneOf(a, b):
return a || b
end
但是,这似乎让我错过了一些案例?
python中的这个测试让它看起来有点不同:
>>> a = None
>>> b = None
>>> notNoneOf(a,b)
>>>
任何帮助表示感谢。
答案 0 :(得分:2)
a is None and b or a
在逻辑上等同于*:
(!a && b) || a
*请参阅下面的评论 - 它不是相当等效,但解释仍然适用。
然而,这是一个毫无意义的过度复杂化。这再次相当于更简单的方法:
a || b
轻微的赠品是notNoneOf
的奇怪功能名称。一个更明智的函数名称是eitherOf
- 这使得上面的实现看起来立即正确。
所以在ruby中,我只想把它写成:
def either(a, b)
a || b
end
(或者,更可能的是,甚至根本没有把它抽象成一个单独的方法!!)
然而,通过树木看到木头,我不会继续&#34;翻译&#34;这两个语言之间的代码广告verbium。 python代码看起来非常混乱,容易出错;它python operator precedence - 这只是在寻找麻烦!
很多更好的解决方案是使用HTML解析器(例如using a regular expression to parse HTML)来编写它。你可以写代码如下:
doc = Nokogiri::HTML(data)
doc.css('input').each do |input|
puts input.name
puts input.value
end
确切了解python代码的作用,并尝试复制其行为而不是实现。