def in?(*args)
if args.length > 1
args.include? self
else
another_object = args.first
if another_object.respond_to? :include?
another_object.include? self
else
raise ArgumentError.new("The single parameter passed to #in? must respond to #include?")
end
end
end
def in?(another_object)
another_object.include?(self)
rescue NoMethodError
raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
end
你可以很容易地找到大部分的这一点,只要问Ruby:
# Grab the method:
meth = 'Region'.method(:in?)
# Ask the method who its owner is:
meth.owner
#=> Object
# Ask the method where it is defined:
meth.source_location
#=> ['lib/ruby/gems/3.2.0/gems/activesupport-7.0.4.3/lib/active_support/core_ext/object/inclusion.rb', 12]
请注意,Ruby on Rails 3已经过时了。它已经很多年没有被维护了,它不适用于当前的Ruby版本,并且它有未修补的安全漏洞。你应该 * 强烈 * 考虑更新到一个受支持和维护的Ruby on Rails版本。
1条答案
按热度按时间zfciruhq1#
foo.in?(bar)
在foo
引用的对象上调用名为in?
的方法,并将表达式bar
的计算结果作为参数传递。与所有面向对象的语言一样,调用方法的对象决定了方法的含义。所以,如果你想知道
in?
是什么意思,你必须看看foo
是什么类型的对象,然后检查in?
的定义是从哪里来的,然后阅读该方法的文档。你用ruby标记了你的问题,但是Ruby中没有为
String
定义in?
方法。因此,该方法必须来自其他地方,可能是某个第三方库。你还用ruby-on-rails-3标记了问题。Ruby on Rails包括
activesupport
RubyGem,它将许多Core Extensions添加到Ruby核心库中。其中一个核心扩展是测试 inclusion:2.14
in?
predicate
in?
测试一个对象是否包含在另一个对象中。如果传递的参数不响应include?
,则会引发ArgumentError
异常。in?
的例子:Here is the documentation which is part of Ruby on Rails 3.2.16:
in?(*args)
如果此对象包含在参数中,则返回true。参数必须是响应
#include?
的任何对象,也可以选择传入多个参数。使用方法:如果传入一个参数,并且它不响应
#include?
,则会抛出ArgumentError
。这就是它是如何实现的:
如你所见
仅委托给
在Ruby on Rails的现代版本中,它仍然存在:
in?(another_object)
如果此对象包含在参数中,则返回true。参数必须是响应
#include?
的任何对象。使用方法:如果参数不响应
#include?
,则会抛出ArgumentError
。如您所见,行为发生了轻微变化:对多个参数的支持已被删除。因此,现在的实现简单地:
你可以很容易地找到大部分的这一点,只要问Ruby:
请注意,Ruby on Rails 3已经过时了。它已经很多年没有被维护了,它不适用于当前的Ruby版本,并且它有未修补的安全漏洞。你应该 * 强烈 * 考虑更新到一个受支持和维护的Ruby on Rails版本。