2016-09-27 1 views
0

--l = 4と--w = 4でsolve-3を実行すると、関数rectangle.perimeterとrectangle.areaがNaNを出力します。どうして? 私には、入力された整数が文字列に変換されていて、なぜNumber()が追加されたのかがわかりましたが、何も変更されませんでした。node.js(yargs)の数字が文字列として入力されていますか?

ファイル1:RECT-2.js

module.exports = function(l,w,callback) { 
try { 
    if (l < 0 || w < 0) { 
     throw new Error("Rectangle dimensions should be greater than zero: l = " + l + ", and w = " + w); 
    } 
    else 
     callback(null, { 
      perimeter: function(l,w) { 
       return (2*(l+w)); 
      }, 
      area: function(l,w) { 
       return (l*w); 
      } 
    }); 
} 
catch (error) { 
    callback(error,null); 
} 
} 

ファイル2:あなたが定義した関数で解決-3.js

var argv = require('yargs') 
.usage('Usage: node $0 --l=[number] --w=[number]') 
.demand(['l','w']) 
.argv; 


var rect = require('./rect-2'); 

function solveRect(l,w) { 
    console.log("Solving for rectangle with length: " + l + " and  width: " + w); 

rect(l,w, function(err,rectangle) { 
    if (err) { 
     console.log(err); 
    } 
    else { 
     console.log("The area of a rectangle with length = "+l+" and width = "+w+" is "+rectangle.area()); 
     console.log("The perimeter of a rectangle with length = "+l+" and width = "+w+" is "+rectangle.perimeter()); 
    } 
    }); 
}; 

solveRect(Number(argv.l),Number(argv.w)); 
+0

あなたが使用する必要があります '文字列を数値に変換するにはparseInt()またはparseFloat()を使用します。 – generalhenry

答えて

0

ルック:

perimeter: function(l,w) { 
    return (2*(l+w)); 
}, 

この関数には2つの引数が必要です。

その後は、引数なしでそれを呼び出す:

rectangle.perimeter() 

あなたが定義している引数があなたのRECT-2ファイルの上側の範囲でものをシャドウイングされています。簡単な回避策は、単に関数の引数を削除することです:

perimeter: function() { 
    return (2*(l+w)); 
}, 
area: function() { 
    return (l*w); 
} 

現在、これらの二つの機能は、上位のスコープに存在lw変数を「オーバー閉じて」と言われています。

​​内の文字列をラップすることは技術的にyargsは、あなたがそのような.number()構文とコマンドラインでユーザーの入力値の種類を指定できますことに注意してください、この場合には動作しますが:

var argv = require('yargs') 
    .number(['l','w']) 
    .demand(['l','w']) 
+0

ありがとう!それはうまくいった! –

+0

あなたの質問に誰かが回答した場合は、答えの横にあるチェックマークをクリックして正しいとマークします。 –

関連する問題