স্কালায় কোনও ফাংশন সংজ্ঞায়িত করার এই তিনটি পদ্ধতির মধ্যে পার্থক্য


92

একই ক্রিয়াকলাপটি প্রকাশের তিনটি উপায় দেওয়া f(a) := a + 1:

val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1

এই সংজ্ঞাগুলি কীভাবে আলাদা? আরপিএল কোনও সুস্পষ্ট পার্থক্য নির্দেশ করে না:

scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>

11
আপনার অবশ্যই লক্ষ্য করা উচিত যে উপরের ২ য় ব্লকে, f1আরপিএলে f1মূল্যায়ন করার সময় মূল্যায়ন করার সময় স্থিতিশীলভাবে আবদ্ধ মানটি দেখানো হয় f2এবং সেই পদ্ধতিগুলি আহ্বানেরf3 ফলাফল প্রদর্শন করে । বিশেষত, প্রতিবারই একটি নতুন উদাহরণ তৈরি হয় বা হয়, তবে চিরকাল একই থাকে is Function1[Int, Int]f2f3f1Function1[Int, Int]
রেন্ডাল শুল্জ

@ র্যান্ডলশুলজ প্রদত্ত যে ভাল সংস্করণটির জন্য কোনও নতুন ফাংশন উদাহরণ প্রয়োজন হয় না, কেন এই ক্ষেত্রে কেউ কেন ডিএফ ব্যবহার করবে?
ভ্যুচুলেয়েস

4
@ ভার্চুয়ালাইস কেবলমাত্র সেই পরিস্থিতিটি আমি স্মরণ করতে পারি যেখানে কেউ দেখায় যে ফাংশনএন ফলন দেয় [...] মান সম্মিলনকারী পার্সার লাইব্রেরিতে রয়েছে। পদ্ধতিগুলি লিখে ফাংশনগুলি পাওয়া খুব সাধারণ বিষয় নয় যা কার্যকরীভাবে কখনই কোনও শব্দার্থ / ক্রিয়ামূলকভাবে অপরিবর্তনীয় ফাংশনটির অনেকগুলি অনুলিপি তৈরি করতে ডিএফ ব্যবহার করে না।
র্যান্ডল শুল্জ

উত্তর:


112

f1 এমন একটি ফাংশন যা পূর্ণসংখ্যা নেয় এবং পূর্ণসংখ্যা ফেরত দেয়।

f2শূন্য আরেটি সহ এমন একটি পদ্ধতি যা একটি ফাংশন দেয় যা একটি পূর্ণসংখ্যা নেয় এবং পূর্ণসংখ্যা ফেরত দেয়। (আপনি f2পরে আরপিএল টাইপ করলে এটি পদ্ধতিতে কল হয়ে যায় f2))

f3হিসাবে একই f2। আপনি কেবল সেখানে টাইপ অনুমিতি নিয়োগ করছেন না।


6
কেন f1একটি হল functionএবং f2একটি হয় method?
ফ্রিউইন্ড

17
@ ফ্রিওয়াইন্ড, একটি ফাংশন এমন একটি অবজেক্ট যা নামকরণের পদ্ধতি সহ apply। একটি পদ্ধতি, ভাল, একটি পদ্ধতি।
মিসিংফ্যাক্টর

দুর্দান্ত উত্তর। প্রশ্ন: আপনি বলছেন f2 এর শূন্যতা আছে, তবে এটি অবিচ্ছিন্ন নয়? en.wikedia.org/wiki/Arity "একটি nullary ফাংশন কোন যুক্তি লাগে না। একটি unary ফাংশন একটি যুক্তি লাগে।" উৎসুক!
ম্যাথিউ কর্নেল

4
@ ম্যাথহে কর্নেল f2নিজেই কোনও যুক্তি স্বীকার করেন না। এটি যে ফাংশনটি দেয় তা করে।
মিসিংফ্যাক্টর

122

কোনও শ্রেণীর ভিতরে, valসূচনাতে মূল্যায়ন করা হয় যখন defকেবল তখনই মূল্যায়ন করা হয় এবং প্রতিবার , ফাংশনটি ডাকা হয়। নীচের কোডটিতে আপনি দেখতে পাবেন যে প্রথমবার অবজেক্টটি ব্যবহার করার সময় এক্সটিকে মূল্যায়ন করা হয়, তবে x সদস্য অ্যাক্সেস করা হলে আবার হয় না। বিপরীতে, যখন বস্তুটি তাত্ক্ষণিকভাবে করা হয় তখন y এর মূল্যায়ন হয় না, তবে যতবার সদস্যের অ্যাক্সেস করা হয় ততবার মূল্যায়ন করা হয়।

  class A(a: Int) {
    val x = { println("x is set to something"); a }
    def y = { println("y is set to something"); a }
  }

  // Prints: x is set to something
  val a = new A(1)

  // Prints: "1"
  println(a.x)

  // Prints: "1"                               
  println(a.x)

  // Prints: "y is set to something" and "1"                                  
  println(a.y)

  // Prints: "y is set to something" and "1"                                                                                   
  println(a.y)

@ জ্যাকোবাসআর কি এক ক্লাসের মধ্যেই এটি সত্য?
অ্যান্ড্রু ক্যাসিডি

উদাহরণস্বরূপ: স্কেলা> var বি = 5 বি: ইন্ট = 5 স্কেল> ভাল এ: (ইনট => ইন্ট) = এক্স => এক্স + বি: ইন্ট => ইন্ট = <function1> স্কালা> এ (5) রেজ 48: ​​ইন = 10 স্কেল> বি = b বি: অন্তঃ = sc স্কেলা> এ (৫) রেস 49: ইনট = 11 আমি প্রত্যাশা করছিলাম একটি (5) 10 ফেরত আসবে এবং খ এর মান অন্তর্ভুক্ত হবে
অ্যান্ড্রু ক্যাসিডি

@ অ্যান্ড্রুস্যাসিডি ফাংশনটি সূচনাতে অচল aএবং মূল্যায়ন করা হলেও bএটি একটি পরিবর্তনীয় মান হিসাবে রয়ে গেছে। সুতরাং bসূচনাটি সূচনা করার সময় সেট করা হয়েছে তবে সংরক্ষণাগারটির মানটি bপরিবর্তনযোগ্য remains মজা করার জন্য আপনি এখন একটি নতুন তৈরি করতে পারেন val b = 123। এর পরে আপনার a(5)সর্বদা 11 দেওয়া হবে, যেহেতু bএখন সম্পূর্ণ নতুন মান।
জ্যাক

@ জ্যাকোবাসআর ধন্যবাদ ... এটি উপলব্ধি করে। এটি "লেজিকাল স্কোপ" সংজ্ঞাটির সাথে মিলে যায় যেহেতু ফাংশনটিতে মূল "var বি" এর একটি উল্লেখ রয়েছে। আমি অনুমান করি যা আমাকে বিভ্রান্ত করেছে তা বলে: var b = 5; ভাল সি = খ; খ = 6; ভিন্নভাবে কাজ করে। আমি অনুমান করি যে কোনও ফাংশন সংজ্ঞাটি আশা করি না যা মূল "লেজিকাল" স্কোপের সাথে ইন্টের মতো একই আচরণ করতে পারে।
অ্যান্ড্রু ক্যাসিডি

3

যেমন একটি সংজ্ঞা নির্বাহ Def এক্স = ই অভিব্যক্তি নির্ণয় করা হবে না । পরিবর্তে মূল্যায়ন করা হয় যখনই এক্স ব্যবহৃত হয়। বিকল্পভাবে, স্কালা একটি মান সংজ্ঞা ভল x = ই সরবরাহ করে , যা সংজ্ঞাটির মূল্যায়নের অংশ হিসাবে ডান হাতের এবং মূল্যায়ন করে। যদি পরবর্তীকালে এক্স ব্যবহার করা হয়, তবে এটি তত্ক্ষণাত্ -এর প্রাক-গণিত মান দ্বারা প্রতিস্থাপিত হবে , যাতে এক্সপ্রেশনটি আবার মূল্যায়নের প্রয়োজন হয় না।

স্কেল বাই উদাহরণ দ্বারা মার্টিন ওডারস্কি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.