Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在ruby 1.9中可以用===调用进程?_Ruby_Ruby 1.9_Proc Object - Fatal编程技术网

为什么在ruby 1.9中可以用===调用进程?

为什么在ruby 1.9中可以用===调用进程?,ruby,ruby-1.9,proc-object,Ruby,Ruby 1.9,Proc Object,在ruby 1.9中提到了4种调用进程的方法,===是其中之一。我不明白为什么会这样做。它是否与===(询问两个对象是否是同一个对象)的正常含义有任何关系 irb(main):010:0>f=->n{[:hello,n]} => # irb(main):011:0>f.call(:hello) =>[:你好,:你好] irb(主):012:0>f==:你好 =>[:你好,:你好] irb(主):013:0>Object.new===Object.new =>错误 irb(主):014:0>f==

在ruby 1.9中提到了4种调用进程的方法,===是其中之一。我不明白为什么会这样做。它是否与===(询问两个对象是否是同一个对象)的正常含义有任何关系

irb(main):010:0>f=->n{[:hello,n]} => # irb(main):011:0>f.call(:hello) =>[:你好,:你好] irb(主):012:0>f==:你好 =>[:你好,:你好] irb(主):013:0>Object.new===Object.new =>错误 irb(主):014:0>f==f =>[:你好,#] :

它允许proc对象在 案例陈述

这是一个可能是人为的例子:

even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
  puts "even!"
else
  puts "odd!"
end
它之所以有效,是因为
案例/when
基本上是这样执行的:

if even === n
  puts "even!"
else
  puts "odd!"
end
case/when
通过调用
==
when子句的参数来检查要执行的分支,选择第一个返回真实值的分支


尽管它与等式运算符(
==
)相似,但它并不是它的强或弱形式。我试着把
==
操作符看作是“属于”操作符<代码>类将其定义为可以检查对象是否属于该类(即,是该类的实例或该类的子类),
范围
将其定义为检查参数是否属于该范围(即,是否包含在该范围内),依此类推。这并没有真正使
Proc
案例更有意义,但可以将其视为一种工具,使您自己的“属于”操作符,如我上面的示例所示;我定义了一个对象,可以确定某个对象是否属于偶数集。

请注意,Ruby中的
==
与JavaScript不同,它与相等无关。它专门用于:


当您需要在比较时计算某些内容时,此功能在案例构造中非常有用

is_odd  =-> n { n%2 != 0 }
is_even =-> n { n%2 == 0 }

case 5
when is_even
  puts "the number is even"
when is_odd
  puts "the number is odd"
end

=> the number is odd
它是否与===(询问两个对象是否是同一个对象)的正常含义有任何关系

实际上,对于Ruby中的
==
,这是一个常见的误解。实际上,它并不严格用于
Object#Object_id
比较(尽管这是它在许多常见调用中的行为)。在Ruby中,
==
是大小写

下面是来自
对象的
==
的描述:“大小写相等——对于类对象,实际上是相同的 作为调用#==,但通常由子体覆盖 在case语句中提供有意义的语义。”


不幸的是,尽管它由三个
=
组成,但它与等式没有任何关系:-D

哦,ruby为了获得好的case/when块所走的长度:-)
String===“foo”=>true
@louism,依我看,与在case语句中使用regex(相当于Enumerable#grep)相比,这并不奇怪或者使用块作为可枚举项#选择
.Hmm。。。我在@theo添加类似于他的答案之前进行了编辑。。。GMTA@JohnBachir,我认为你的编辑不适合描述案例构建中lambda的概念
case cats.length
  when 42                         # Uses 42      === cats.length
    puts :uh
  when /cool/i                    # Uses /cool/i === cats.length
    puts :oh
  when ->(n){ n.odd? || n/3==6 }  # Passes cats.length to the proc
    puts :my
end
is_odd  =-> n { n%2 != 0 }
is_even =-> n { n%2 == 0 }

case 5
when is_even
  puts "the number is even"
when is_odd
  puts "the number is odd"
end

=> the number is odd