পরিবর্তনশীল অপারেটরগুলি কি সম্ভব?


উত্তর:


177

বাক্সের বাইরে নয়। তবে জেএস সহ অনেক ভাষায় হাতে হাতে তৈরি করা সহজ।

var operators = {
    '+': function(a, b) { return a + b },
    '<': function(a, b) { return a < b },
     // ...
};

var op = '+';
alert(operators[op](10, 20));

আপনার plusযদি প্রয়োজন না হয় তবে স্ট্রিংগুলির মধ্য দিয়ে যাওয়া এড়াতে আপনি যেমন ascii- ভিত্তিক নামগুলি ব্যবহার করতে পারেন । যাইহোক, এইগুলির অনুরূপ অর্ধেক প্রশ্নের জিজ্ঞাসা করা হয়েছিল কারণ কারও কাছে অপারেটরগুলির প্রতিনিধিত্বকারী স্ট্রিং ছিল এবং সেগুলি থেকে ফাংশন চেয়েছিল।


6

আমি বিশ্বাস করি আপনি একটি পরিবর্তনশীল অপারেটর চান। এখানে একটি, অবজেক্ট হিসাবে তৈরি। আপনি বর্তমান অপারেশন পরিবর্তন করে পরিবর্তন করতে পারেন:

[yourObjectName].operation = "<" //changes operation to less than


function VarOperator(op) { //you object containing your operator
    this.operation = op;

    this.evaluate = function evaluate(param1, param2) {
        switch(this.operation) {
            case "+":
                return param1 + param2;
            case "-":
                return param1 - param2;
            case "*":
                return param1 * param2;
            case "/":
                return param1 / param2;
            case "<":
                return param1 < param2;
            case ">":
                return param1 > param2;
        }
    }
}

//sample usage:
var vo = new VarOperator("+"); //initial operation: addition
vo.evaluate(21,5); // returns 26
vo.operation = "-" // new operation: subtraction
vo.evaluate(21,5); //returns 16
vo.operation = ">" //new operation: ">"
vo.evaluate(21,5); //returns true

6

আপনি eval()ফাংশনটি ব্যবহার করতে পারেন , তবে এটি ভাল ধারণা নয়। আমি মনে করি আরও ভাল উপায় এটি আপনার অপারেটরদের জন্য ফাংশনগুলি লিখেছেন:

var addition = function(first, second) {
   return first+second;
};

var subtraction = function(first, second) {
   return first-second;
};

var operator = addition;

alert(operator(12, 13));

var operator = subtraction;

alert(operator(12, 13));

6

আমরা এটি প্রয়োগকারী ব্যবহার করে বাস্তবায়ন করতে পারি, যেহেতু আমরা এটি অপারেটর পরীক্ষার জন্য ব্যবহার করছি।

var number1 = 30;
var number2 = 40;
var operator = "===";

function evaluate(param1, param2, operator) {
     return eval(param1 + operator + param2);
}

if(evaluate(number1, number2, operator)) {
}

এইভাবে আমরা গতিশীল অপারেটর মূল্যায়ন ব্যবহার করতে পারি।


3

আমি সম্প্রতি পোস্ট করা অন্য একটি উত্তর থেকে, এটি ভি 8-তে রয়েছে এবং আমি মনে করি জাভাস্ক্রিপ্ট কোর, তবে ফায়ারফক্স নয় এবং এটি কোনও নির্দিষ্ট নয়। যেহেতু আপনি অপারেশন এবং তুলনাকারীদের ফাঁদে ফেলতে পারেন আপনি বেশিরভাগ পরিস্থিতিতে কিছুটা কাজ নিয়ে অপারেটর নেটিভ ওভারলোডিং বাস্তবায়ন করতে পারেন।

var actions = [];
var overload = {
  valueOf: function(){
    var caller = arguments.callee.caller;
    actions.push({
      operation: caller.name,
      left: caller.arguments[0] === this ? "unknown" : this,
      right: caller.arguments[0]
    });
    return Object.prototype.toString.call(this);
  }
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);

আউটপুট:

[ { operation: 'EQUALS',
    left: overload,
    right: 10 },
  { operation: 'MUL',
    left: overload,
    right: 10 },
  { operation: 'DIV',
    left: 'unknown',
    right: overload },
  { operation: 'IN',
    left: overload,
    right: DOMWindow },
  { operation: 'UNARY_MINUS',
    left: overload,
    right: undefined },
  { operation: 'TO_NUMBER',
    left: overload,
    right: undefined },
  { operation: 'COMPARE',
    left: overload,
    right: 5 },
  { operation: 'COMPARE',
    left: 'unknown',
    right: overload },
  { operation: 'ToString',
    left: 'unknown',
    right: overload } ]

এই মুহুর্তে আপনার সমস্ত ইনপুট এবং অপারেশন রয়েছে তাই অবশিষ্ট অংশটি অপারেশনের ফলাফল। ক্রিয়াকলাপটির প্রাপক স্ট্রিং বা সংখ্যাটি একটি আদিম মান পাবে এবং আপনি এটিকে আটকাতে পারবেন না। যদি এটি একটি স্বেচ্ছাসেবী গ্রহণকারী না হয় তবে আপনি যে শ্রেণীর অপারেটরটি ওভারলোড করেছেন তার একটি উদাহরণ বলুন, আপনি ইনকামিং মানটিকে বাধা দিতে / ওভাররাইটিং প্রতিরোধ করতে বিভিন্ন গেট / সেট ট্র্যাপগুলি পরিচালনা করতে পারেন। আপনি কিছু কেন্দ্রীয় লুকের মধ্যে অপারেশনগুলি এবং অপারেশন সঞ্চয় করতে পারেন এবং কোনও আদিম মানের এটি তৈরির অপারেশনটিতে ফিরে পেতে একটি সহজ পদ্ধতি ব্যবহার করতে পারেন এবং তারপরে আপনি আপনার পছন্দসই ক্রিয়াকলাপটি করতে চান তা যুক্তি তৈরি করতে পারেন। আর এক পদ্ধতি যা স্বেচ্ছাসেবী গ্রহণকারীদের পরে জটিল আকারে পুনর্গঠন করতে পারে তা হ'ল ডেটা আদিম মানের মধ্যে এনকোডিং করা যাতে এটি আপনার জটিল শ্রেণিতে ফিরে যেতে পারে। যেমনটি বলুন যে 3 স্বতন্ত্র 8 বিট পূর্ণসংখ্যার (255,255,255) আরজিবি মানটি একটি প্রান্তে একক সংখ্যায় রূপান্তরিত হতে পারে এবং গ্রাহক প্রান্তটি তুচ্ছ এটি এটিকে আবার তার জটিল উপাদানগুলিতে রূপান্তর করতে পারে। বা আরও জটিল ডেটার জন্য আপনি এমনকি কোনও জেএসওএন সিরিয়ালযুক্ত স্ট্রিংও ফিরে আসতে পারেন।

হারমোনি প্রক্সিতে অ্যাক্সেস থাকা (ফায়ারফক্স 6 +, পতাকা সহ নোডেজ) এই পুরো প্রক্রিয়াটিকে অত্যন্ত সহজ করে তোলে, কারণ আপনি মূলত সমস্ত কিছুর উপর ফাঁসির প্রক্সি তৈরি করতে পারেন এবং পুরো প্রক্রিয়াটি শেষ থেকে শেষ পর্যন্ত অন্তর্ভুক্ত করতে পারেন এবং আপনি যা করতে চান তা করতে পারেন। আপনার ডেটা / শ্রেণির অপারেন্ড উদাহরণগুলি, অভ্যন্তরীণ ইঞ্জিন অ্যাক্সেস করতে পারে এমন প্রতিটি সম্ভাব্য মানটির মান / অফ / স্ট্রিং / গ্রাহকরা, আপনার যে কোনও রিসিভার অবজেক্ট সম্পর্কে প্রাক সচেতনতা আছে এবং এমনকি স্বেচ্ছাসেবক রিসিভারের ক্ষেত্রে ফাঁদে ফেলতে পারেwith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }


2

আপনি জাভাস্ক্রিপ্টে অপারেটরগুলি ওভারলোড করতে পারবেন না। আপনি অবশ্যই সাহায্যের জন্য ফাংশন ব্যবহার বন্ধ করতে পারেন

var plus = function(a, b) {
    return a + b;
};

var smaller = function(a, b) { 
    return a < b;
};

var operator = plus;
var total = operator(a, b);
operator = smaller;
if(operator(var1, var2)){ /*do something*/ }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.