স্কালায় `: _ *` (কোলন আন্ডারস্কোর তারকা) কী করে?


195

এই প্রশ্নটি থেকে আমার কাছে কোডের নীচের অংশ রয়েছে :

def addChild(n: Node, newChild: Node) = n match {
  case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)
  case _ => error("Can only add children to elements!")
}

এই অংশটি ব্যতীত এর সবকিছুই পরিষ্কার clear child ++ newChild : _*

এটার কাজ কি?

আমি বুঝতে পেরেছি যে সেখানে Seq[Node]অন্যের সাথে সংযুক্ত আছে Node, এবং তারপর? কি করে : _*?


70
শিরোনামে (কোলন আন্ডারস্কোর তারকা) যুক্ত করার জন্য আপনাকে অনেক ধন্যবাদ!
গাল

উত্তর:


151

এটি 1 টি অনুক্রম "স্প্ল্যাটস" করে।

নির্মাতার স্বাক্ষর দেখুন

new Elem(prefix: String, label: String, attributes: MetaData, scope: NamespaceBinding,
         child: Node*)

যা হিসাবে বলা হয়

new Elem(prefix, label, attributes, scope,
         child1, child2, ... childN)

কিন্তু এখানে আছে শুধুমাত্র একটি ক্রম, না child1, child2ইত্যাদি তাই এই অনুমতি দেয় ফলাফলের ক্রম কন্সট্রাকটর ইনপুট হিসাবে ব্যবহার করা হয়।

শুভ কোডিং।


1 এটির এসএলএসে একটি cutesy- নাম নেই, কিন্তু এখানে বিশদ আছে। গুরুত্বপূর্ণ জিনিসটি হ'ল এটি পরিবর্তন করে যে কীভাবে স্কালা পুনরাবৃত্ত পরামিতিগুলি ( Node*উপরে বর্ণিত হিসাবে ) সাথে পদ্ধতিতে যুক্তিগুলি আবদ্ধ করে ।

_*টাইপ টীকা SLS এর "4.6.2 বারবার পরামিতি" মধ্যে আবৃত করা হয়।

প্যারামিটার বিভাগের সর্বশেষ মান প্যারামিটারটি "*" দ্বারা suf-xed হতে পারে, যেমন (..., x: T *)। পদ্ধতির অভ্যন্তরে এ জাতীয় পুনরাবৃত্ত পরামিতিগুলির ধরণটি তখন সিক্যুয়েন্স টাইপ স্কেল। সেক [টি]। পুনরাবৃত্ত প্যারামিটার টি * সহ পদ্ধতিগুলি টি এর ধরণের আর্গুমেন্টের একটি পরিবর্তনশীল সংখ্যা নেয়। এটি হ'ল, যদি কোনও পদ্ধতি এম টাইপযুক্ত (p1: T1,।, Pn: Tn, PS: S *) U টি আর্গুমেন্টে প্রয়োগ করা হয় (e1,।।, এক) যেখানে k> = এন হয়, তার পরে মি হয় এই অ্যাপ্লিকেশনটিতে টাইপ (p1: T1,।, pn: Tn, PS: S,।।, PS0S) U, টাইপ এস এর উপস্থিতি রয়েছে যেখানে পিএসের বাইরে যে কোনও প্যারামিটারের নাম টাটকা রয়েছে Uএই নিয়মের একমাত্র ব্যতিক্রম হ'ল যদি শেষ আর্গুমেন্টটি _ * প্রকারের টিকাশির মাধ্যমে ক্রম যুক্তি হিসাবে চিহ্নিত করা হয়। যদি উপরের মিটি আর্গুমেন্টে প্রয়োগ করা হয় (e1,।।, En, e0: _ *), তবে সেই অ্যাপ্লিকেশনটিতে এম এর ধরণ হবে (p1: T1,।, Pn: Tn, PS: scala .Seq [গুলি])


5
আমরা এটি "চুম্বন অপারেটর" কল করতে চান, যদিও এটি আসলে একটি অপারেটর নয় :)
হেনরিক Gustafsson

1
পাইথনে একে আনপ্যাকিং বলা হয়
জোশলক

সিকোয়েন্সটি কত দীর্ঘ হতে পারে, যেমন জাভা ভারার্গসের সাথে রয়েছে তার কোনও সীমা রয়েছে?
qwwqwwq 3'17

95
  • child ++ newChild - ক্রম
  • : - টাইপ অ্যাসিলেশন, একটি ইঙ্গিত যা সংকলকটিকে বুঝতে সাহায্য করে, কী ধরণের এক্সপ্রেশন থাকে
  • _* - স্থানধারক যেকোন মান + ভারার্গ অপারেটর গ্রহণ করে

child ++ newChild : _*প্রসারিত Seq[Node]হয় Node*(সংকলকটি বলছে যে আমরা বরং একটি ক্রমানুসারে বরং ভারার্গসের সাথে কাজ করছি)। বিশেষভাবে কেবল সেই পদ্ধতিগুলির জন্য দরকারী যা কেবলমাত্র ভ্যারাগগুলি গ্রহণ করতে পারে।


1
আপনি "টাইপ অ্যাসক্রিপশন" সম্পর্কে আরও লিখতে পারেন? এটি কী এবং এটি কীভাবে কাজ করে?
এ্যামারফিস


24

উপরের সমস্ত উত্তর দুর্দান্ত দেখাচ্ছে, তবে এটি ব্যাখ্যা করার জন্য কেবল একটি নমুনার প্রয়োজন। এটা এখানে :

val x : Seq[Seq[Int]] = Seq(Seq(1),Seq(2))

def f(arg: Seq[Any]*) : Int = {
 arg.length
}
f(x) //1 as x is taken as single arg
f(x:_*)  // 2 as x is "unpacked" as a Seq[Any]*

তাই এখন আমরা জানি যে :_*কম্পাইলারটি বলতে কী হয়: দয়া করে এই যুক্তিটি আনপ্যাক করুন এবং এক্সটিকে একক যুক্তি হিসাবে গ্রহণের পরিবর্তে ফাংশন কলের মধ্যে ভারারগ প্যারামিটারে এই উপাদানগুলিকে আবদ্ধ করুন।

সুতরাং সংক্ষেপে, :_*ভারার্গ প্যারামিটারে যুক্তিটি পাস করার সময় অস্পষ্টতা দূর করা।


5

আমার মতো অলস কিছু লোকের জন্য, এটি কেবল একটি সিককে ভ্যারআরজে রূপান্তর করে!

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