晴耕雨読

working in the fields on fine days and reading books on rainy days

JSでRubyの .times .upto .downto メソッドを作る

JavaScriptでRubyのIntegerクラスのメソッド times, upto, downto を作る方法。

Integer#times

Ruby

Integer#times はブロックの処理をself回繰り返します。

5.times do |i|
  puts i
end

出力

0
1
2
3
4

JavaScript

timesメソッドをJavaScriptで実装すると次のようになります。

Number.prototype.times = function (block) {
  for (var i = 0; i < this; i++) {
    block.call(null, i);
  }
  return +this;
}

使用例

(5).times(function (i) {
  console.log(i);
});

Rubyで 5. とだけ書くとSyntax Errorとなるが、 JavaScriptでは 5. は整数の5と解釈されます。 それが影響しているかどうかはわからないですが、JavaScriptのNumberのインスタンスメソッドを呼び出すときは 値をパーレン()で囲む必要があります。

変数に代入して使う分にはパーレンを付けなくても問題ないです。

var n = 5;
n.times(function (i) {
  console.log(i);
});

Integer#upto

Ruby

Integer#upto はブロックの処理をselfからlimitまで1ずつ増やしながら繰り返します。

1.upto(5) do |i|
  puts i
end

出力

1
2
3
4
5

JavaScript

uptoメソッドをJavaScriptで実装すると次のようになります。

Number.prototype.upto = function (limit, block) {
  if (limit < this) return +this;

  for (var i = +this; i <= limit; i++) {
    block.call(null, i);
  }
  return +this;
};

使用例

(1).upto(5, function(i) {
  console.log(i);
});

Integer#downto

Ruby

Integer#downto はブロックの処理をselfからlimitまで1ずつ減らしながら繰り返します。

15.downto(10) do |i|
  puts i
end

出力

15
14
13
12
11
10

JavaScript

downtoメソッドをJavaScriptで実装すると次のようになります。

Number.prototype.downto = function (limit, block) {
  if (limit > this) return +this;

  for (var i = +this; i >= limit; i--) {
    block.call(null, i);
  }
  return +this;
};

使用例

(15).downto(10, function (i) {
  console.log(i);
});