2017-06-23 2 views
1

Ich kann nicht herausfinden, was dieser Code hier tut. Das Beste, was ich sagen kann, ist | ist das bitweise ODER und -> ist für ein Lambda, kann aber als Ganzes noch keinen Sinn ergeben.Was wäre der folgende Code 'Thread | -> 'in Rubin tun?

pipe = Thread | -> (p) do 
     end 
+1

In rubin der Code tut " NoMethodError: undefinierte Methode '| ' für Thread: Klasse ":) –

Antwort

4

Der Code tut noch nichts. Es ist eine korrekte (aber irgendwie komische) Syntax, und das definierte Lambda tut nichts.

| ist nicht bitweise OR, es ist eine Methode Name der Thread Klasse, für die ruby-thread Juwel:

require 'thread/pipe' 

p = Thread |-> d { d * 2 } |-> d { d * 4 } 
p << 2 

puts ~p # => 16 

Aber du hast Recht, obwohl es möglich ist, | dann Methode aufrufen, ohne a . zwischen Thread und dem Methodennamen, weil die Ruby-Syntax Code wie 2 | 3 als Zucker für 2.|(3) zulässt.

Ohne das Juwel beschwert sich Ruby über eine NoMethodError. Um ein wenig mit der Syntax zu spielen, könnten Sie versuchen:

class Thread 
    def self.|(some_proc) 
    some_proc.call("some_param") 
    end 
end 

pipe = Thread | -> (p) do 
    puts "Inside a proc, called from 'Thread.|' with parameter #{p}" 
end 

Es gibt:

Inside a proc, called from 'Thread.|' with parameter some_param 

Eine weitere Möglichkeit, den Anruf zu schreiben wäre:

pipe = Thread.|(lambda{|param| puts "Inside a proc, called from 'Thread.|' with parameter #{param}"})