কেন রুবি আই ++ বা আই-- (ইনক্রিমেন্ট / হ্রাস অপারেটর) সমর্থন করে না?


130

প্রাক / পোস্ট ইনক্রিমেন্ট / হ্রাস অপারেটর ( ++এবং --) বেশ স্ট্যান্ডার্ড প্রোগ্রামিং ল্যাঙ্গুয়েজ সিনট্যাক্স (পদ্ধতিগত এবং অবজেক্ট-ভিত্তিক ভাষার জন্য, কমপক্ষে)।

কেন রুবি তাদের সমর্থন করেন না? আমি বুঝতে পেরেছি এবং আপনি একই জিনিসটি সম্পন্ন করতে পেরেছিলেন +=এবং -=তবে এটির মতো কিছু বাদ দেওয়া অদ্ভুতভাবে স্বেচ্ছাচারী বলে মনে হচ্ছে, বিশেষত যেহেতু এটি এত সংক্ষিপ্ত এবং প্রচলিত।

উদাহরণ:

i = 0    #=> 0
i += 1   #=> 1
i        #=> 1
i++      #=> expect 2, but as far as I can tell, 
         #=> irb ignores the second + and waits for a second number to add to i

আমি বুঝতে পারি Fixnumস্থাবর, কিন্তু যদি +=কেবল একটি নতুন ইনস্ট্যান্সেট করে Fixnumসেট করতে পারি তবে কেন একই কাজ করবেন না ++?

=চরিত্রটি ধারণ করে দেওয়া কার্যগুলিতে ধারাবাহিকতা কি এর একমাত্র কারণ, বা আমি কিছু হারিয়ে ফেলছি?


2
এই ধরনের অপারেটরগুলির জন্য গ্রেপ রুবি সোর্স কোড। যদি কিছুই না থাকে - ম্যাটজ তাদের পছন্দ করে না।
আইমান্তাস

আপনি কোনও +=অপারেটরের সাথে প্রিনক্রেনমেন্ট করতে পারবেন না । সিআইতে কেবলমাত্র আক্ষরিক / মৌলিক বিবৃতিতে পছন্দ করে কেবলমাত্র শর্তের অভ্যন্তরে ++/ ব্যবহার করার চেষ্টা করুন । সম্ভবত কারণ আমি পাইথন শিখেছি (যদিও সি এর অনেক পরে ...)--+=-=
নিক

পাইথনের জন্য গতকাল কি তেমন কোনও প্রশ্ন ছিল না?
BoltClock

@ আইমান্তাস স্পষ্টতই ভাষার স্রষ্টা তাদের পছন্দ করেন নি। এটি উপেক্ষা করা খুব সাধারণ। আমি ভাবছিলাম কেন, যা কিছুটা নীচে উত্তর দিয়ে পরিষ্কার করা হয়েছে।
অ্যান্ডি_ভালহপ

1
আমি মনে করি এটি (প্রায়) একটি মডেল এসও প্রশ্ন। এটি এমন কিছু নয় যা বিবেচিত উত্তর পাওয়ার জন্য গুগলযোগ্য নয় able কী উত্তর প্রয়োজন তা এটি বেশ স্পষ্ট এবং সুনির্দিষ্ট এবং উত্তরটি প্রোগ্রামিংয়ের একটি দিকের উপরে আলোকপাত করে যা একজনকে কেবল প্রশ্নের মূল অংশের চেয়ে আরও বিস্তৃতভাবে চিন্তা করতে পারে।
বেগুনি পাইলট

উত্তর:


97

এখানে মাতজ (ইউকিহিরো মাতসুমোটো) কীভাবে এটি একটি পুরানো থ্রেডে ব্যাখ্যা করেছেন :

Hi,

In message "[ruby-talk:02706] X++?"
    on 00/05/10, Aleksi Niemelä <aleksi.niemela@cinnober.com> writes:

|I got an idea from http://www.pragprog.com:8080/rubyfaq/rubyfaq-5.html#ss5.3
|and thought to try. I didn't manage to make "auto(in|de)crement" working so
|could somebody help here? Does this contain some errors or is the idea
|wrong?

  (1) ++ and -- are NOT reserved operator in Ruby.

  (2) C's increment/decrement operators are in fact hidden assignment.
      They affect variables, not objects.  You cannot accomplish
      assignment via method.  Ruby uses +=/-= operator instead.

  (3) self cannot be a target of assignment.  In addition, altering
      the value of integer 1 might cause severe confusion throughout
      the program.

                            matz.

10
2 এবং 3 পরস্পরবিরোধী বলে মনে হচ্ছে। যদি স্ব-নিয়োগটি খারাপ হয়, তবে +=/ -=ঠিক আছে কেন ? এবং 1+=1ঠিক খারাপ হবে না ? (এটি আইআরবিতে ব্যর্থ হয় syntax error, unexpected ASSIGNMENT)
অ্যান্ডি_ভালপ

2
(২) এর অর্থ হ'ল সিতে, আপনি মানটি নিজেই পরিবর্তন করেন না ... আপনি যে ভেরিয়েবলের মানটি ধারণ করেন সেগুলির বিষয়বস্তু পরিবর্তন করছেন। এটি যে কোনও ভাষার মান অনুসারে যায় তার জন্য এটি খুব বেশি মেটা। রুবিতে রেফারেন্সের মাধ্যমে কিছু পাস করার উপায় না থাকলে (এবং আমি সত্যিকার অর্থে "রেফারেন্স দ্বারা", মান দ্বারা রেফারেন্সটি পাস না করে) পরিবর্তনশীল নিজেই কোনও পদ্ধতির মধ্যে পরিবর্তন সম্ভব হবে না।
সিএইচও

5
হয়তো আমি এখানে কিছু মিস করছি। +=সম্পূর্ণ নতুন অবজেক্টের সাথে ভেরিয়েবলের রেফারেন্সকে বস্তুর প্রতিস্থাপন করে। আপনি i.object_idআগে এবং পরে কল করে এটি পরীক্ষা করতে পারেন i+=1। কেন এটি করতে আরও প্রযুক্তিগতভাবে জটিল হবে ++?
অ্যান্ডি_ভালহপ

6
@ অ্যান্ডি_ভালহপ: # 3 ব্যাখ্যা করছে যে কার্যনির্বাহীকরণের পদ্ধতিটি কেন প্রযুক্তিগতভাবে অসম্ভব, কেন অ্যাসাইনমেন্টটি সাধারণভাবে অসম্ভব নয় (পোস্টার ম্যাটজ ভেবেছিল যে কোনও ++পদ্ধতি তৈরি করা সম্ভব হতে পারে ) তার উত্তর দিচ্ছিল )।
ছক

2
রুবিতে সমস্ত আক্ষরিক বস্তুও। সুতরাং আমি বিশ্বাস করি মাত্জ বলতে চেষ্টা করছেন যে তিনি নিশ্চিত নন যে তিনি বিবৃতি হিসাবে 1++ নিয়ে কাজ করার ধারণা পছন্দ করেন। ব্যক্তিগতভাবে আমি এটি অযৌক্তিক বলে মনে করি যেহেতু @ অ্যান্ডি_ভালহপ যেমন বলেছেন যে 1 + = 2 ঠিক তেমনি ওয়াচ এবং আপনি যখন এটি করেন তখন রুবি কেবল একটি ত্রুটি উত্থাপন করে। সুতরাং 1++ পরিচালনা করা খুব কঠিন নয়। সম্ভবত এই জাতীয় সিনট্যাকটিক চিনির সাথে লড়াই করার জন্য পার্সারের প্রয়োজনীয়তা অনাকাঙ্ক্ষিত।
স্টিভ মিডলেগি

28

এর একটি কারন এখন যে নিয়োগ অপারেটরের যে (অর্থাত একটি অপারেটর যা পরিবর্তনশীল পরিবর্তন) একটি আছে =তাতে। আপনি যদি যোগ করেন ++এবং --, এটি আর হয় না।

আরেকটি কারণ হ'ল লোকের আচরণ ++এবং --প্রায়শই মানুষকে বিভ্রান্ত করে। দৃষ্টিতে কেস: i++আপনার উদাহরণের রিটার্নের মানটি আসলে 2 হবে না 1 (তবে এর নতুন মান 2 iহবে)।


4
এখন পর্যন্ত অন্য যে কোনও কারণের চেয়ে যুক্তিযুক্ত যে "সমস্ত কার্যক্রমে =তাদের মধ্যে একটি রয়েছে" তা বোধগম্য মনে হয়। আমি শ্রদ্ধার সাথে বাছাই করতে পারি যে ধারাবাহিকতার একটি কঠোর আনুগত্য।
অ্যান্ডি_ভালহপ

এই সম্পর্কে কি: a.capitalize! (এটার অন্তর্নিহিত দায়িত্ব)
লুয়াস সোয়ারস

1
@ LuísSoares a.capitalize!পুনরায় নিয়োগ দেয় না a, এটি স্ট্রিংটিকে পরিবর্তিত করবে ato একই স্ট্রিংয়ের অন্যান্য রেফারেন্সগুলি প্রভাবিত হবে এবং আপনি a.object_idকল করার আগে এবং পরে যদি তা করেন তবে আপনি capitalizeএকই ফলাফল পাবেন (যার a = a.capitalizeপরিবর্তে আপনি যদি এটি করেন তবে কোনটিই সত্য হবে না )।
sepp2k

1
@ LuísSoares হিসাবে আমি বলেছি, a.capitalize!একই স্ট্রিংয়ের অন্যান্য রেফারেন্সগুলিকে প্রভাবিত করবে। এটি একটি বাস্তব পার্থক্য। উদাহরণস্বরূপ যদি আপনার কাছে থাকে def yell_at(name) name.capitalize!; puts "HEY, #{name}!" endএবং আপনি এটির পরে এটিকে কল করেন: এখন my_name = "luis"; yell_at(my_name)এর মান my_nameহবে "LUIS", যদি আপনি এটি ব্যবহার করেন capitalizeএবং কোনও অ্যাসাইনমেন্ট ব্যবহার করেন তবে এটির ক্ষতি হবে না ।
sepp2k

1
কি দারুন. এটি ভীতিজনক ... জেনে যে জাভা স্ট্রিংগুলি অবিচ্ছেদ্য .. তবে ক্ষমতার সাথে দায়িত্ব আসে। ব্যাখ্যার জন্য ধন্যবাদ.
Luís Soares

25

এটি ওও ভাষায় প্রচলিত নয়। প্রকৃতপক্ষে, ++স্মলটকের কোনও নেই , যে ভাষাটি "অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং" শব্দটি তৈরি করেছিল (এবং রুবি ভাষাটি সবচেয়ে দৃ strongly়ভাবে প্রভাবিত)। আপনার অর্থটি হ'ল এটি সি ও ভাষাগুলিতে প্রচলিত রয়েছে যা সি ঘনিষ্ঠভাবে অনুকরণ করে রুবিতে কিছুটা সি-এর মতো বাক্য গঠন রয়েছে তবে এটি সি traditionsতিহ্যগুলিকে মেনে চলা কোন দাসত্ব নয়।

কেন এটি রুবিতে নেই: মাতজ এটি চায়নি। এটা আসলে চূড়ান্ত কারণ।

স্মলটকের ক্ষেত্রে এ জাতীয় কোনও বিষয় নেই বলে কারণ ভাষাটির ওভাররাইডিং দর্শনের অংশ এটি যে ভেরিয়েবল নির্ধারণ করা মূলত কোনও বস্তুর কাছে বার্তা প্রেরণের চেয়ে ভিন্ন ধরণের জিনিস it's এটি একটি ভিন্ন স্তরের। এই চিন্তাভাবনাটি সম্ভবত রুবিকে ডিজাইনে ম্যাটজকে প্রভাবিত করেছিল।

এটিকে রুবিতে অন্তর্ভুক্ত করা অসম্ভব হবে না - আপনি সহজেই এমন একটি প্রিপ্রসেসর লিখতে পারেন যা সমস্তকে রূপান্তরিত ++করে +=1। তবে স্পষ্টতই ম্যাটজ অপারেটরের ধারণা পছন্দ করেননি যা একটি "লুকানো অ্যাসাইনমেন্ট" করেছে। এটির ভিতরে কোনও লুকানো পূর্ণসংখ্যা অপারেটর থাকা অপারেটরটি থাকাও কিছুটা অদ্ভুত বলে মনে হয়। ভাষার কোনও অপারেটর সেভাবে কাজ করে না।


1
আমি মনে করি না আপনি প্রিপ্রসেসর পরামর্শটি কাজ করবে; (কোনও বিশেষজ্ঞ নয়) তবে আমি মনে করি যে আমি = ৪২, আমি ++ ৪২ ফিরে আসব যেখানে i + = 1 ফিরে আসবে ৪৩. আমি কি এতে ভুল করছি? সুতরাং সেই ক্ষেত্রে আপনার পরামর্শটি হ'ল আই ++ ব্যবহার করা যেমন ++ আমি সাধারণত ব্যবহৃত হয় যা বেশ খারাপ ইমো এবং ভাল থেকে বেশি ক্ষতি হতে পারে।
আতুরস্যামস

12

আমি মনে করি এর আরও একটি কারণ রয়েছে: ++রুবিতে সি এবং এর সরাসরি উত্তরসূরিদের মতো দূর থেকে কার্যকর হবে না।

মূল কারণ for: মূলশব্দ: এটি সিতে প্রয়োজনীয় হলেও এটি বেশিরভাগ ক্ষেত্রে রুবিতে অতিরিক্ত অতিরিক্ত। রুবির বেশিরভাগ পুনরাবৃত্তিটি গণ্য পদ্ধতিগুলির মাধ্যমে করা হয়, যেমন eachএবং mapযখন কোনও ডেটা স্ট্রাকচার এবং Fixnum#timesপদ্ধতির মাধ্যমে পুনরাবৃত্তি করা হয় , যখন আপনাকে বারবার একটি সঠিক সংখ্যা লুপ করতে হয়।

প্রকৃতপক্ষে, আমি যতদূর দেখেছি, বেশিরভাগ সময় +=1সি-স্টাইলের ভাষা থেকে রুবিতে সরে যাওয়া লোকেরা ব্যবহার করে।

সংক্ষেপে, যদি পদ্ধতিগুলি ++এবং --আদৌ ব্যবহৃত হয় তবে এটি সত্যই প্রশ্নযুক্ত ।


1
এটি সেরা উত্তর imho। ++ প্রায়শই পুনরাবৃত্তির জন্য ব্যবহৃত হয়। রুবি এই ধরণের পুনরাবৃত্তি উত্সাহ দেয় না।
আতুরস্যামস

3

আমি মনে করি মাতজ তাদের পছন্দ না করার যুক্তিটি হ'ল এটি আসলে পরিবর্তকের পরিবর্তে একটি নতুনকে প্রতিস্থাপন করে।

উদা:

a = SomeClass.new
Def a.go
  'হ্যালো'
শেষ
# এই মুহুর্তে, আপনি a.go কল করতে পারেন
# তবে আপনি যদি একটি ++ করেন
# এর প্রকৃত অর্থ a = a + 1
# যাতে আপনি আর.গো কল করতে পারবেন না
# যেমন আপনি নিজের আসলটি হারিয়েছেন

এখন যদি কেউ তাকে বোঝাতে পারে যে এটি কেবল # সুসকে কল করা উচিত! বা কি না, এটি আরও বোধগম্য হবে এবং সমস্যাটি এড়াবে। আপনি এটি রুবি কোর উপর পরামর্শ দিতে পারেন।


9
"আপনি এটি রুবি কোর সম্পর্কে পরামর্শ দিতে পারেন" ... আপনি অন্যান্য থ্রেডগুলিতে যুক্তিগুলি পড়ার এবং বোঝার পরে যেখানে এটি সর্বশেষবার পরামর্শ দেওয়া হয়েছিল, এবং তার আগে সময়, এবং তার আগে সময় এবং তার আগে সময়, এবং তার আগের সময়টি, এবং ... আমি রুবি সম্প্রদায়ের খুব বেশি সময় ছিলাম না, তবে আমার সময়কালে, আমি কমপক্ষে বিশটি আলোচনা মনে করি remember
J:01rg ডব্লু মিট্টাগ

3

আপনি একটি .+স্ব-বর্ধনকারী অপারেটরকে সংজ্ঞায়িত করতে পারেন :

class Variable
  def initialize value = nil
    @value = value
  end
  attr_accessor :value
  def method_missing *args, &blk
    @value.send(*args, &blk)
  end
  def to_s
    @value.to_s
  end

  # pre-increment ".+" when x not present
  def +(x = nil)
    x ? @value + x : @value += 1
  end
  def -(x = nil)
    x ? @value - x : @value -= 1
  end
end

i = Variable.new 5
puts i                #=> 5

# normal use of +
puts i + 4            #=> 9
puts i                #=> 5

# incrementing
puts i.+              #=> 6
puts i                #=> 6

"ক্লাস ভেরিয়েবল" সম্পর্কিত আরও তথ্য " ক্লাস ভেরিয়েবল টু ইনক্রিমেন্ট ফিকনাম অবজেক্টস " এ উপলব্ধ।


2

এবং ডেভিড ব্লকের কথায় তাঁর "দ্য ওয়েল-গ্রাউন্ডেড রুবিস্ট" বইটি থেকে:

রুবির কিছু বস্তু তাত্ক্ষণিক মান হিসাবে ভেরিয়েবলে সংরক্ষণ করা হয়। এর মধ্যে পূর্ণসংখ্যা, চিহ্নগুলি (যা দেখতে এটির মতো দেখায়) এবং বিশেষ বস্তুগুলি সত্য, মিথ্যা এবং শূন্য থাকে। আপনি যখন এই ভ্যারিয়েবলের (x = 1) এ মানগুলির একটি নির্ধারণ করেন, তখন ভেরিয়েবলটি কোনও রেফারেন্সের পরিবর্তে মানটি ধরে রাখে। ব্যবহারিক ভাষায়, এটি কোনও বিষয় নয় (এবং এটি প্রায়শই বারবার বানান না করে এই বইয়ের উল্লেখ এবং সম্পর্কিত বিষয়গুলির আলোচনার পরিবর্তে বর্ণিত হিসাবে ছেড়ে দেওয়া হবে)। রুবি অবজেক্টের রেফারেন্সগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করে; তাত্ক্ষণিক পূর্ণসংখ্যার মান সম্বলিত কোনও বস্তুর বিপরীতে কোনও স্ট্রিংয়ের রেফারেন্স ধারণ করে এমন কোনও বস্তুর বার্তা পাঠাতে আপনার কোনও অতিরিক্ত কাজ করতে হবে না। তবে তাত্ক্ষণিক-মান উপস্থাপনের নিয়মে বেশ কয়েকটি আকর্ষণীয় বিষয় রয়েছে, বিশেষত যখন এটি পূর্ণসংখ্যার দিকে আসে। একটি জিনিসের জন্য, যে কোনও বস্তু যা অবিলম্বে মান হিসাবে প্রতিনিধিত্ব করে তা সর্বদা হুবহু একই জিনিস হয়, যতই নির্ধারিত পরিমাণে এটির ভেরিয়েবল নির্ধারিত হয় না। এখানে কেবলমাত্র একটি বস্তু 100, কেবলমাত্র একটি বস্তু মিথ্যা এবং আরও অনেক কিছু। পূর্ণসংখ্যা-বেঁধে দেওয়া ভেরিয়েবলগুলির তাত্ক্ষণিক, অনন্য প্রকৃতির পিছনে রয়েছে রুবির প্রাক- এবং উত্তরোত্তর অপারেটরগুলির অভাব behind যার অর্থ, আপনি রুবিতে এটি করতে পারবেন না: x = 1 x ++ # এরকম কোনও অপারেটর কারণ নয় x, x ++ এ 1 এর তাত্ক্ষণিক উপস্থিতিতে 1 ++ এর মতো হবে, যার অর্থ আপনি 1 নম্বরটি 2 নাম্বারে পরিবর্তন করছেন এবং এর কোনও অর্থ হয় না। এটি কতগুলি ভেরিয়েবল বরাদ্দ করা যায় তা বিবেচনা করে না। এখানে কেবলমাত্র একটি বস্তু 100, কেবলমাত্র একটি বস্তু মিথ্যা এবং আরও অনেক কিছু। পূর্ণসংখ্যা-বেঁধে দেওয়া ভেরিয়েবলগুলির তাত্ক্ষণিক, অনন্য প্রকৃতির পিছনে রয়েছে রুবির প্রাক- এবং উত্তরোত্তর অপারেটরগুলির অভাব behind যার অর্থ, আপনি রুবিতে এটি করতে পারবেন না: x = 1 x ++ # এরকম কোনও অপারেটর কারণ নয় x, x ++ এ 1 এর তাত্ক্ষণিক উপস্থিতিতে 1 ++ এর মতো হবে, যার অর্থ আপনি 1 নম্বরটি 2 নাম্বারে পরিবর্তন করছেন এবং এর কোনও অর্থ হয় না। এটি কতগুলি ভেরিয়েবল বরাদ্দ করা যায় তা বিবেচনা করে না। এখানে কেবলমাত্র একটি বস্তু 100, কেবলমাত্র একটি বস্তু মিথ্যা এবং আরও অনেক কিছু। পূর্ণসংখ্যা-বেঁধে দেওয়া ভেরিয়েবলগুলির তাত্ক্ষণিক, অনন্য প্রকৃতির পিছনে রয়েছে রুবির প্রাক- এবং উত্তরোত্তর অপারেটরগুলির অভাব behind যার অর্থ, আপনি রুবিতে এটি করতে পারবেন না: x = 1 x ++ # এরকম কোনও অপারেটর কারণ নয় x, x ++ এ 1 এর তাত্ক্ষণিক উপস্থিতিতে 1 ++ এর মতো হবে, যার অর্থ আপনি 1 নম্বরটি 2 নাম্বারে পরিবর্তন করছেন এবং এর কোনও অর্থ হয় না।


তবে কীভাবে আপনি "1.next" করতে পারেন?
ম্যাগনে

1

ফিক্সনাম বা পূর্ণসংখ্যার শ্রেণিতে একটি নতুন পদ্ধতি যুক্ত করে এটি অর্জন করা যায়নি?

$ ruby -e 'numb=1;puts numb.next'

ফেরত 2

!সম্ভাব্য ব্যবহারকারীদের সাবধান করার জন্য "ধ্বংসাত্মক" পদ্ধতিগুলি যুক্ত হয়েছে বলে মনে হয় , সুতরাং একটি নতুন পদ্ধতি যুক্ত করা যা next!অনুরোধ করা হয়েছে তাই করবে।

$ ruby -e 'numb=1; numb.next!; puts numb' 

2 প্রদান (যেহেতু অসাড় বর্ধিত হয়েছে)

অবশ্যই, next!পদ্ধতিটি পরীক্ষা করে দেখতে হবে যে বস্তুটি একটি পূর্ণসংখ্য পরিবর্তনশীল এবং আসল সংখ্যা নয়, তবে এটি উপলব্ধ হওয়া উচিত


1
Integer#nextএর Integer#succপরিবর্তে ('উত্তরসূরি'র জন্য) বলা ছাড়া এটি ইতিমধ্যে বিদ্যমান (কম বা কম )। তবে Integer#next!(বা Integer#succ!) বাজে কথা হবে: মনে রাখবেন যে পদ্ধতিগুলি ভেরিয়েবল নয়, বস্তুগুলিতে কাজ করে , তাই হুবহু সমান হবে , যার অর্থ এটি 1 কে 2 এর সমান হতে রূপান্তরিত করবে । কোনও অ্যাসাইনমেন্টের জন্য সিনট্যাকটিক চিনি হতে পারে বলে এটি সামান্য ভাল হতে পারে তবে ব্যক্তিগতভাবে আমি বর্তমান বাক্য গঠনটি পছন্দ করি যেখানে সমস্ত অ্যাসাইনমেন্ট সম্পন্ন হয় । numb.next!1.next!++=
ফিলোমোরি

উপরের মন্তব্যটি সম্পূর্ণ করতে: এবং Integer#predপূর্বসূরীর পুনরুদ্ধার করতে।
Yoni

-6

এই অপারেটরগুলিকে রুবির আইআরবিতে সি-পরিবার থেকে দেখুন এবং সেগুলি নিজের জন্য পরীক্ষা করুন:

x = 2    # x is 2
x += 2   # x is 4
x++      # x is now 8
++x      # x reverse to 4

3
এটি স্পষ্টতই ভুল এবং এটি কাজ করে না, যেমন (x++)রুবির একটি অবৈধ বিবৃতি।
anothermh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.