微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby – 确定变量是否是值列表中的任何一个的最短/最惯用的方法是什么?

这似乎是一个非常简单的问题,但是在 Ruby中重写这个的最短/最惯用的方法是什么?
if variable == :a or variable == :b or variable == :c or variable == :d # etc.

我看到了这个解决方

if [:a,:b,:c,:d].include? variable

但这并不总是在功能上相同 – 我相信Array #include?实际上是查看变量对象是否包含在列表中;它没有考虑到对象可以使用def ==(other)实现自己的相等测试.

正如下面有用的评论员所观察到的那样,这种解释是不正确的.包括?确实使用==但它使用数组中项目的==方法.在我的例子中,它是符号,而不是变量的==方法.这就解释了为什么它不等于我的第一个代码示例.

(例如,Rails的Mime :: Type实现:request.format ==:html可能返回true,但是[:html] .include?(request.format)将返回false,因为request.format是一个实例Mime :: Type,而不是符号.)

我到目前为止最好的是:

if [:a,:d].select {|f| variable == f}.any?

但对我来说似乎有些麻烦.有没有人有更好的建议?

解决方法

实际上,#include?确实使用==.如果你这样做,问题就出现了
[:a].include? foo

它检查:a == foo,而不是foo ==:a.也就是说,它使用在Array中的对象上定义的==方法,而不是变量.因此,只要确保数组中的对象具有正确的==方法,就可以使用它.

如果不起作用,您可以通过删除select语句并将块直接传递给任何语句来简化语句:

if [:a,:d].any? {|f| variable == f}

原文地址:https://www.jb51.cc/ruby/268905.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐