আমাকে কেন দ্রুতগতিতে আন্ডারস্কোর দরকার?


161

এখানে এটি বলা হয়েছে, "দ্রষ্টব্য: এর _অর্থ" আমি সেই মানটির বিষয়ে চিন্তা করি না "", তবে জাভাস্ক্রিপ্ট থেকে আসার পরে আমি এর অর্থ কী তা বুঝতে পারি না।

এই ফাংশনগুলি মুদ্রণের জন্য কেবলমাত্র প্যারামিটারগুলির পূর্বে আন্ডারস্কোরগুলি ব্যবহার করে আমি পেতাম:

func divmod(_ a: Int, _ b:Int) -> (Int, Int) {
    return (a / b, a % b)
}

print(divmod(7, 3))
print(divmod(5, 2))
print(divmod(12,4))

আন্ডারস্কোরগুলি ছাড়াই কোনও ত্রুটি এড়াতে আমাকে এটি লিখতে হবে:

func divmod(a: Int, b:Int) -> (Int, Int) {
    return (a / b, a % b)
}

print(divmod(a: 7, b: 3))
print(divmod(a: 5, b: 2))
print(divmod(a: 12,b: 4))

আমি এই আন্ডারস্কোর ব্যবহার বুঝতে পারি না। আমি কখন, কেন এবং কেন এই আন্ডারস্কোরগুলি ব্যবহার করব?

উত্তর:


353

বিভিন্ন ব্যবহারের ক্ষেত্রে কয়েকটি ঘরোয়া বিষয় রয়েছে তবে সাধারণত একটি আন্ডারস্কোর মানে "এটি উপেক্ষা করুন"।


নতুন ফাংশন ঘোষণার সময়, একটি আন্ডারস্কোর সুইফটকে বলে যে প্যারামিটারটির কল করার সময় কোনও লেবেল থাকা উচিত নয় - এটিই আপনি দেখছেন। একটি পূর্ণাঙ্গ ফাংশন ঘোষণার মত দেখাচ্ছে:

func myFunc(label name: Int) // call it like myFunc(label: 3)

"লেবেল" একটি আর্গুমেন্ট লেবেল এবং আপনি যখন ফাংশনটি কল করবেন তখন অবশ্যই উপস্থিত থাকতে হবে। (এবং সুইফট 3 থেকে, ডিফল্টরূপে সমস্ত যুক্তির জন্য লেবেলগুলি প্রয়োজনীয় required) ফাংশনের অভ্যন্তরে আপনি যে যুক্তিটি ব্যবহার করেন তার নাম "নাম" the একটি সংক্ষিপ্ত রূপটি দেখতে দেখতে:

func myFunc(name: Int) // call it like myFunc(name: 3)

এটি একটি শর্টকাট যা আপনাকে বাহ্যিক আর্গুমেন্ট লেবেল এবং অভ্যন্তরীণ প্যারামিটার নাম উভয়ের জন্য একই শব্দটি ব্যবহার করতে দেয়। এর সমতুল্য func myFunc(name name: Int)

আপনি যদি প্যারামিটার লেবেল ছাড়াই আপনার ফাংশনটি কল করতে চান তবে আপনি আন্ডারস্কোরটি লেবেলটিকে _কিছুই / উপেক্ষা করার জন্য ব্যবহার করবেন । (সেই ক্ষেত্রে আপনি যদি প্যারামিটারটি ব্যবহার করতে সক্ষম হতে চান তবে আপনাকে একটি অভ্যন্তরীণ নাম সরবরাহ করতে হবে))

func myFunc(_ name: Int) // call it like myFunc(3)

একটি কার্যনির্বাহী বিবৃতিতে, একটি আন্ডারস্কোর অর্থ "কোনও কিছুকে বরাদ্দ করবেন না"। আপনি যদি এমন কোনও ফাংশনটিতে কল করতে চান যা কোনও ফলাফল দেয় তবে আপনি যে মানটি ফিরে পেয়েছেন সে সম্পর্কে চিন্তা না করে আপনি এটি ব্যবহার করতে পারেন।

_ = someFunction()

অথবা, আপনি যে নিবন্ধটির সাথে লিঙ্ক করেছেন তার মতো, ফিরে আসা টিউপের একটি উপাদানটিকে উপেক্ষা করতে:

let (x, _) = someFunctionThatReturnsXandY()

যখন আপনি কোনও ক্লোজার লিখেন যা কিছু সংজ্ঞায়িত ফাংশন প্রকার প্রয়োগ করে, আপনি নির্দিষ্ট পরামিতিগুলি উপেক্ষা করতে আন্ডারস্কোর ব্যবহার করতে পারেন।

PHPhotoLibrary.performChanges( { /* some changes */ },
    completionHandler: { success, _ in // don't care about error
        if success { print("yay") }
    })

একইভাবে, কোনও ফাংশন যা প্রোটোকল গ্রহণ করে বা সুপারক্লাস পদ্ধতিটি ওভাররাইড করে তা ঘোষণার সময়, আপনি _প্যারামিটারের নামগুলি পরামিতিগুলি উপেক্ষা করতে ব্যবহার করতে পারেন । যেহেতু প্রোটোকল / সুপারক্লাস এছাড়াও সংজ্ঞায়িত করতে পারে যে প্যারামিটারটির কোনও লেবেল নেই, আপনি এমনকি পরপর দুটি আন্ডারস্কোর দিয়ে শেষ করতে পারেন।

class MyView: NSView {
    override func mouseDown(with _: NSEvent) {
        // don't care about event, do same thing for every mouse down
    }
    override func draw(_ _: NSRect) {
        // don't care about dirty rect, always redraw the whole view
    }
}

কিছুটা শেষের দুটি শৈলীর সাথে সম্পর্কিত: কোনও ফ্লো কন্ট্রোল কনস্ট্রাক্ট ব্যবহার করার সময় যা কোনও স্থানীয় ভেরিয়েবল / ধ্রুবককে আবদ্ধ করে, আপনি _এটিকে উপেক্ষা করার জন্য ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনি এর সদস্যদের অ্যাক্সেসের প্রয়োজন ছাড়াই কোনও ক্রম পুনরাবৃত্তি করতে চান:

for _ in 1...20 { // or 0..<20
    // do something 20 times
}

আপনি যদি একটি স্যুইচ বিবৃতিতে টুপল কেসগুলিকে আবদ্ধ করেন, আন্ডারস্কোরটি ওয়াইল্ডকার্ড হিসাবে কাজ করতে পারে, উদাহরণ হিসাবে ( দ্য সুইফ্ট প্রোগ্রামিং ভাষার একটি থেকে সংক্ষিপ্ত ):

switch somePoint { // somePoint is an (Int, Int) tuple
case (0, 0):
    print("(0, 0) is at the origin")
case (_, 0):
    print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
    print("(0, \(somePoint.1)) is on the y-axis")
default:
    print("(\(somePoint.0), \(somePoint.1)) isn't on an axis")
}

একটা শেষ জিনিস যে বেশ সাথে সম্পর্কিত না, কিন্তু যা আমি যেহেতু অন্তর্ভুক্ত করব (যেমন মন্তব্য লক্ষনীয়) তা এখানে লোকেদের নেতৃত্ব দেওয়ার জন্য বলে মনে হয়: একটি আন্ডারস্কোর মধ্যে - যেমন একটি আইডেন্টিফায়ার var _foo, func do_the_thing(), struct Stuff_- মানে সুইফট বিশেষ কিছুই, কিন্তু কিছু ব্যবহার করা হয় প্রোগ্রামারদের মধ্যে।

নামের মধ্যে বোঝার শৈলীগুলি একটি শৈলীর পছন্দ, তবে সুইফ্ট সম্প্রদায়টিতে পছন্দ হয় না, যা অন্য ধরণের চিহ্নের জন্য আপারকামেলকেস এবং লোয়ারকামেলকেস প্রকারের জন্য ব্যবহারের বিষয়ে দৃ conven় সম্মেলন করে।

আন্ডারস্কোর সহ একটি প্রতীক নামের উপসর্গ বা প্রত্যয় একটি স্টাইলের কনভেনশন, historতিহাসিকভাবে রফতানিকারকৃত API থেকে ব্যক্তিগত / অভ্যন্তরীণ-ব্যবহৃত-চিহ্নগুলি পৃথক করতে ব্যবহৃত হয়। তবে এর জন্য সুইফ্টের অ্যাক্সেস মডিফায়ার রয়েছে, তাই সাধারণত এই সম্মেলনটি সুইফটে অ-প্রতিমা হিসাবে দেখা হয়।

func __foo()অ্যাপলের এসডিকেগুলির গভীরতায় ডাবল-আন্ডারস্কোর উপসর্গগুলি ( ) লুকিয়ে থাকা কয়েকটি চিহ্ন : এগুলি NS_REFINED_FOR_SWIFTঅ্যাট্রিবিউটটি ব্যবহার করে সুইফটে আমদানি করা (ওবজ) সি প্রতীক । অ্যাপল ব্যবহার করে যে যখন তারা কোনও (ওবিজে) সি এপিআইয়ের একটি "আরও সুইফটি" সংস্করণ তৈরি করতে চান - উদাহরণস্বরূপ, জেনেরিক পদ্ধতিতে টাইপ-অজোনস্টিক পদ্ধতি তৈরি করতে । পরিশোধিত সুইফ্ট সংস্করণটি তৈরি করতে তাদের আমদানি করা API ব্যবহার করা দরকার, তাই __বেশিরভাগ সরঞ্জাম এবং ডকুমেন্টেশন থেকে এটি লুকিয়ে রাখার সময় তারা এটি উপলব্ধ রাখার জন্য ব্যবহার করে ।


@ ইরিস্টার, কোনও পদ্ধতির শুরুতে আন্ডারস্কোরটির তাত্পর্যটি কী, যেমন এই-> ফানক _কপি কনটেন্টস (পিটিআর শুরু করা: অনিরাপদ পরিবর্তনযোগ্য বাফারপয়েন্টার <উপাদান>) -> (আইট্রেটার, অনিরাপদ পরিবর্তনযোগ্য বাফারপয়েন্টার <উপাদান> ইনডেক্স) Se সিকোয়েন্স প্রোটোকল থেকে।
দেব জিআর

@ দেবগ্রার: সম্পূর্ণরূপে সম্পর্কিত নয়, তাই আমি আলাদা প্রশ্ন পোস্ট করার পরামর্শ দিচ্ছি।
রিক্সার

অবশ্যই, আমি একটি পৃথক প্রশ্ন পোস্ট করব।
দেব জিআর

ফাংশন রিটার্নের জন্য "কোনও কিছুকে বরাদ্দ করবেন না" এর জন্য ধন্যবাদ। এই আমি খুঁজছিলাম ছিল।
এবসিন

8

গৃহীত উত্তর ছাড়াও, ব্যবহারের ক্ষেত্রে অন্যতম একটি _হ'ল যখন আপনাকে কোডে একটি দীর্ঘ সংখ্যা লিখতে হবে

আরও পঠনযোগ্য নম্বর

এটি মানব পাঠযোগ্য সহজ নয়:

let x = 1000000000000

আপনি যোগ করতে পারেন _এটি আরো পাঠযোগ্য করতে সংখ্যায়:

let x = 1_000_000_000_000

6

সুইফট 3 থেকে, ফাংশন কলগুলিতে প্যারামিটারের নাম উল্লেখ করা বাধ্যতামূলক হয়ে উঠেছে - এমনকি প্রথমটির জন্যও। সুতরাং যেহেতু এটি সুইফট ২ তে লিখিত কোডে বিশাল সমস্যা সৃষ্টি করতে পারে, তাই আপনি ডাকে প্যারামিটারের নামটি রোধ করতে ডিক্লারেশনে একটি আন্ডারস্কোর ব্যবহার করতে পারেন। সুতরাং এই ক্ষেত্রে এটি "বাহ্যিক প্যারামিটার নামটির বিষয়ে চিন্তা করবেন না" বলছে। যেখানে বাহ্যিক প্যারামিটারের নামটি আপনি ফাংশনের বাইরে প্যারামিটারগুলিকে কল করেন (কল করার সময়) ভিতরে না। এই বাহ্যিক প্যারামিটার নামগুলিকে আর্গুমেন্ট লেবেল বলা হয়। http://ericasadun.com/2016/02/09/the-trouble-with-argument-labels-some- خصوصیاتts/ ... দেখুন প্যারামিটারটি কীভাবে দুটি নাম দেওয়া হয়? আন্ডারস্কোরটি যেখানে চলছে সেখানে প্রথম। এটি সাহায্য করে এবং এখনও বিভ্রান্ত কিনা জিজ্ঞাসা করুন।


4
func divmod(_ a: Int, _ b:Int) -> (Int, Int) {
    return (a / b, a % b)
}

func divmod(a: Int, b:Int) -> (Int, Int) {
    return (a / b, a % b)
}

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

সুইফটের ফাংশন নেম কনভেনশন funcName(param1:param2:)এবং ফাংশনের নাম _তৈরি করতে এটির স্থানধারক হিসাবে প্রয়োজন ।

প্রথম নাম, নাম হয়

divmod(_:_:)

যেখানে দ্বিতীয়টি

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