কোটলিন: অন্য একটি প্যারামিটার হিসাবে একটি ফাংশন পাস কিভাবে?


140

প্রদত্ত ফাংশন:

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

আমরা করতে পারি:

foo("a message", { println("this is a message: $it") } )
//or 
foo("a message")  { println("this is a message: $it") }

এখন, আসুন আমাদের নীচের ফাংশনটি বলতে দিন:

fun buz(m: String) {
   println("another message: $m")
}

"বুজ" কে "ফু" তে প্যারামিটার হিসাবে পাস করার কোনও উপায় আছে? কিছুটা এইরকম:

foo("a message", buz)

উত্তর:


198

ব্যবহার করুন ::একটি ফাংশন রেফারেন্স বোঝান, এবং তারপর:

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

// my function to pass into the other
fun buz(m: String) {
    println("another message: $m")
}

// someone passing buz into foo
fun something() {
    foo("hi", ::buz)
}

কোটলিন ১.১ থেকে আপনি এখন ক্লাসের সদস্যদের ফাংশন (" বাউন্ড ক্যালেবেল রেফারেন্স ") ব্যবহার করতে পারেন , উদাহরণটির সাথে ফাংশন রেফারেন্স অপারেটরের উপসর্গ রেখে:

foo("hi", OtherClass()::buz)

foo("hi", thatOtherThing::buz)

foo("hi", this::buz)

1
আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন তবে মনে হয় কেবল শীর্ষ স্তরের ফাংশনগুলি (যেমন কোনও শ্রেণীর অন্তর্ভুক্ত নয়) এই পদ্ধতিতে পাস করা যেতে পারে; শ্রেণি পদ্ধতিগুলি করতে পারে না :-(
জাজা হ্যারিস

7
কোনও সদস্যের রেফারেন্স চারপাশে পাস করা যেতে পারে তবে এটি প্রথম প্যারামিটারের সাথে ক্লাসের একটি উদাহরণ প্রয়োজন এমন ক্ষেত্রে 2 পরামিতি ফাংশন হবে। ক্লাসে বন্ধ হওয়া ল্যাম্বডা দিয়ে সদস্য ফাংশনটি মোড়ানো একটি আরও ভাল উপায়। উপরের সমস্তটি ধরে নেওয়া একটি শ্রেণিতে ছিল: fun something() { foo("hi", { buz(it) }) }
জয়সন মিনার্ড

1
দেখে মনে হচ্ছে যে ক্লাসের সাথে সম্পর্কিত এমন ফাংশনগুলি পাস করা যেতে পারে যদি আপনি একই ক্লাসের মধ্যে কাজ করছেন তবে কোটলিন ১.১ হিসাবে আপনি এটিটি করতে পারেনthis::function
জো মাহের

1
এ ছাড়া, আপনি যদি ফাংশনটি প্যারামিটারকে naclable করতে চান, তবে শেষে একটি প্রশ্ন চিহ্ন দিয়ে বন্ধনীতে টাইপ ডিক্লেয়ারেশনটি মোড়ানো করুন। উদাহরণস্বরূপbar: ((m: String) -> Unit)?
আবা

1
পুনঃটুইট করেছেন প্যারামিটার mfoo এর জন্য, অন্য প্যারামিটারটি ফাংশনে পরিবর্তনশীল বারে ফাংশন টাইপের প্যারামিটার নাম।
জয়সন মিনার্ড

12

পরামিতি হিসাবে সদস্য ফাংশন সম্পর্কে:

  1. কোটলিন শ্রেণি স্থির সদস্যের ক্রিয়াকলাপ সমর্থন করে না, সুতরাং সদস্য ফাংশনটি এইভাবে চালানো যায় না: অপারেটর :: যোগ করুন (5, 4)
  2. সুতরাং, সদস্য ফাংশনটি প্রথম শ্রেণির ফাংশনের মতো ব্যবহার করা যাবে না।
  3. একটি দরকারী পদ্ধতির হ'ল ল্যাম্বদা দিয়ে ফাংশনটি মোড়ানো। এটি মার্জিত নয় তবে কমপক্ষে এটি কাজ করছে।

কোড:

class Operator {
    fun add(a: Int, b: Int) = a + b
    fun inc(a: Int) = a + 1
}

fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b)
fun calc(a: Int, opr: (Int) -> Int) = opr(a)

fun main(args: Array<String>) {
    calc(1, 2, { a, b -> Operator().add(a, b) })
    calc(1, { Operator().inc(it) })
}

4
বর্তমান কোটলিনে, আপনি এখন একটি রেফারেন্স হিসাবে সদস্য ফাংশন ব্যবহার করতে পারেন। আপনার এখন এই উত্তরটি আপডেট করা উচিত।
জেসন মিনার্ড

সঙ্গী অবজেক্ট কলিং কোডে ফাংশনগুলি সংজ্ঞায়িত করে কিছুটা ভাল হয়ে যায় এবং প্রতিবার অপারেটরের কোনও নতুন উদাহরণ তৈরি হয় না। এটি জাভাতে স্থির মজার মতো দেখাবে
CAB

দুর্দান্ত সমাধান, এই একমাত্র উপায়টি আমি খুঁজে পেলাম যখন কাজটি ক্লাসে থাকে তখন কাজ করে। আমি এটিকে কুৎসিত কিন্তু সুন্দর হিসাবে বিবেচনা করি না, প্রায় কোনও কৌনিক টেম্পলেট ভেরিয়েবলের মতো দেখতে কিন্তু কোডের জন্য।
বন্দুকধারীরা


4

পদ্ধতির নামের আগে কেবল "::" ব্যবহার করুন

fun foo(function: () -> (Unit)) {
   function()
}

fun bar() {
    println("Hello World")
}

foo(::bar) আউটপুট :Hello World


এই কোডটি সংকলন করে না "ফাংশন ()" এর জন্য একটি প্যারামিটার প্রয়োজন
জিউস্পেপ জিয়াকপপ্পো


1

আপনি যদি সেটটার এবং গেটর পদ্ধতি পাস করতে চান তবে ।

private fun setData(setValue: (Int) -> Unit, getValue: () -> (Int)) {
    val oldValue = getValue()
    val newValue = oldValue * 2
    setValue(newValue)
}

ব্যবহার:

private var width: Int = 1

setData({ width = it }, { width })

1

জেসন মিনার্ডের উত্তরটি ভাল। এটি ব্যবহার করেও অর্জন করা যেতে পারে lambda

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

val buz = { m: String ->
    println("another message: $m")
}

যা দিয়ে বলা যেতে পারে foo("a message", buz)

আপনি এ ব্যবহার করে এটিকে আরও কিছুটা ডিআরআই করতে পারেন typealias

typealias qux = (m: String) -> Unit

fun foo(m: String, bar: qux) {
    bar(m)
}

val buz: qux = { m ->
    println("another message: $m")
}

0

আরেকটি উদাহরণ:

 fun foo(x:Int, Multiply: (Int) -> (Int)) {
    println(Multiply(x))
 }
 fun bar(x:Int):Int{
    return  x * x
 }
 foo(10, ::bar)

-7

প্রথম শ্রেণির ফাংশন বর্তমানে কোটলিনে সমর্থিত নয়। এটি যুক্ত করার জন্য এটি একটি ভাল বৈশিষ্ট্য হবে কিনা তা নিয়ে বিতর্ক রয়েছে। আমি ব্যক্তিগতভাবে তাদের মনে করা উচিত।

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