2016-07-11 4 views
0

対RubyでJS:これらの2行のコードは同じですか?ルビー

-> { 10.times {|i| puts i} }.call 

Javascriptを:

(function(){ 
    for (i = 0; i<10; i++){ 
     console.log(i); 
    } 
})() 

イムJSの背景から来るとラムダと手続きオブジェクトについて学ぶとき、それはそれらの名前のない関数であることを述べているところ何かが私の興味をピークに達しましたそれは呼ばれます。これは私に匿名の機能やJavaScriptのIIFEを思い出させました。

これら2つの例は同じですか?その違いは何ですか?

+2

'for(var i = 0; ...)'がほしいと確信しています。 IIFEでもこれからあなたを守ることはできません。 –

+0

また、 "IIFE"と "anonymous function"は同義語ではありません –

+0

@SergioTulentsevはい、確かに、ノードで実行するとグローバル変数iを作成して繰り返します(この質問では問題ありません)。 2つのものは同じ..または私は何かが不足しています。 – AlCode

答えて

0

これらの2つの行は、ほとんどすべての面で非常に異なります。

このRubyのスニペットに最も近いのECMAScript同等:、数字はECMAScriptの中のメソッドを持つことはできません、残念ながら

(() => { 10.times(i => puts(i)) }).call()

-> { 10.times {|i| puts i} }.call 

はこのようなものになるだろうだからこのようなものに頼らなければならないでしょう:

0123これが機能するためには、我々はいくつかのRubyライブラリのサポートコードを追加する必要が明らか

(() => { times(10, i => puts(i)) }).call()

、:

(() => { times(10, i => puts(i)) }).call() 
 

 
function times(i, f) { if (i-- === 0) return; else { times(i, f); f(i) }} 
 
function puts(s) { console.log(s) }

非常によく似まだありません元のRubyセマンティクスは、あなたの提案よりもはるかに近い:

  • あなたの提案は、iをグローバルスコープにリークし、Rubyコードはリークさえもiではなく、最も内側のブロックに対してローカルです。
  • Rubyに関数呼び出し演算子がありません。代わりに、Proc#callというメソッドを使用します。このECMAScriptも(Function.prototype.call)です。
  • ループはforループですが、RubyコードはIntegerというメソッドを使用して反復します。
  • Kernel#putsは、既定の出力ストリームとして定義したものに暗黙的に書き込みますが、提案するECMAScriptソリューションは明示的に常にコンソールに書き込みます。
  • selfはRubyで字句的にバインドされていますが、thisを字句的にバインドする矢印関数リテラルを使用しない限り、thisはECMAScriptの関数オブジェクト自体に動的にバインドされます。一方

、これに最も近いRubyの同等:

(function(){ 
 
    for (i = 0; i<10; i++){ 
 
     console.log(i); 
 
    } 
 
})()

はこのようなものになるだろう:

-> { $i = 0; while $i < 10 do $stdout.puts($i); $i += 1 end }.() 

繰り返しますが、これは100ではありません%相当:

  • Rubyにはforループがありません(for … inイテレータのみ)ので、最も近いものはwhileループです。
  • Rubyにはコールオペレータがありません。.()は、callメソッドの構文砂糖です。
  • thisは動的にバインドされており、Rubyのselfは字句です。
関連する問題