これらの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
は字句です。
'for(var i = 0; ...)'がほしいと確信しています。 IIFEでもこれからあなたを守ることはできません。 –
また、 "IIFE"と "anonymous function"は同義語ではありません –
@SergioTulentsevはい、確かに、ノードで実行するとグローバル変数iを作成して繰り返します(この質問では問題ありません)。 2つのものは同じ..または私は何かが不足しています。 – AlCode