অন্য বিবৃতি যদি ওয়ান-লাইনার করবেন কীভাবে?


115

আমি পিএইচপি-তে যেমন যাব (গোলং) তে চলক অ্যাসাইনমেন্ট সহ একটি সাধারণ if-অন্য বিবৃতি লিখতে পারি? উদাহরণ স্বরূপ:

$var = ( $a > $b )? $a: $b;

বর্তমানে আমাকে নিম্নলিখিতগুলি ব্যবহার করতে হবে:

var c int
if a > b {
    c = a
} else {
    c = b
}

দুঃখিত, এই নিয়ন্ত্রণ বিবৃতিটি আমি নামটি মনে করতে পারি না এবং আমি সাইটে বা গুগল অনুসন্ধানের মাধ্যমে তথ্যটি খুঁজে পাই না। : /


4
এটিকে একটি টার্নারি অপারেটর বলা হয় ... এবং না, গো এর একটিও নেই।
সাইমন হোয়াইটহেড

6
আমি বিশ্বাস করি আপনি যে শব্দটির সন্ধান করছেন তা হ'ল "তিনটি"
বেনজামিনআরএইচ


11
কেবল স্পষ্ট করে বলতে গেলে, একটি ত্রিনিরি অপারেটর হল আরটি 3 এর যে কোনও অপারেটর, এটি এমন কোনও অপারেটর যা 3 টি উপ-এক্সপ্রেশনকে বাঁধে। সি এর সাথে কেবলমাত্র একটি অপারেটর থাকে। এজন্য এটিকে সাধারণত টার্নারি অপারেটর বলা হয়। যদিও এর আসল নাম "শর্তাধীন অপারেটর"।

উত্তর:


144

মন্তব্যে উল্লিখিত হিসাবে, গো ত্রৈমাসিকের একটি লাইনার সমর্থন করে না। আমি মনে করতে পারি সবচেয়ে সংক্ষিপ্ত রূপটি:

var c int
if c = b; a > b {
    c = a
}

তবে দয়া করে এটি করবেন না, এটি লাভজনক নয় এবং কেবল আপনার কোডটি পড়ে এমন লোকদের বিভ্রান্ত করবে।


87
@ থারোক আমি সম্ভবত এটি বাস্তব জীবনে সম্ভবত এড়াতে চাইছি, কারণ এটি অজ্ঞাত জ্ঞাত আইএমএইচও, কম পাঠযোগ্যতার জন্য 2 টি লাইন সংরক্ষণ করার পক্ষে এটি মূল্য নয় not
না_এ_গল্ফার

14
@ থারোক, দয়া করে নোট_এ_গল্ফার যা বলেছেন তা শোনো listen আপনার রক্ষণাবেক্ষণযোগ্য সফ্টওয়্যার লেখার চেষ্টা করা উচিত, নিজেকে প্রদর্শন করা উচিত নয় পরিষ্কার কৌশলগুলি ঝরঝরে কিন্তু পরের লোকটি আপনার কোডটি পড়ছে (কয়েক মাস / বছর অন্তর্ভুক্ত আপনাকে) তাদের প্রশংসা করবে না।
kostix

4
এটি নির্ভরযোগ্য, যতদূর পঠনযোগ্যতা। আমি মনে করি এটি আরও পঠনযোগ্য তবে অন্য যে কোনও কিছুর মতো এটিও অপব্যবহার করা যেতে পারে। যদি আপনাকে এমন কোনও ভেরিয়েবল ঘোষণা করতে হয় যা ইফ ব্লকের বাইরে প্রয়োজন হয় না, তবে আমি মনে করি এটি একটি বিজয়ী।
আরজব্বর

@ নট_এ_গল্ফার এটি কেবলমাত্র প্রতিসাম্য দ্বারা পঠনযোগ্যতা নয়, উদ্দেশ্যটির কাঠামোগত বৈপরীত্যটিও সংকলিত কোডে রয়েছে, কখনও কখনও এমনকি অতিরিক্ত অতিরিক্ত ব্যয় ছাড়িয়েও অনর্থক।
নেকড়ে

5
ওহ, আনন্দ, ত্রিনিরি অপারেটর না রেখে গো কতটা অর্জন করেছে তা দেখুন। পাঠযোগ্যতার মতামত ছাড়াও, আপনি একটি অলস-মূল্যায়িত নির্মাণ পরিবর্তন করেছেন যেখানে কেবলমাত্র একটি শাখা এমন একটিতে চালিত হয় যেখানে প্রথম সর্বদা চালিত হয় এবং দ্বিতীয়টি সংযোজন ছাড়াও চালিত হতে পারে।
ব্রুস

32

আমি প্রায়শই নিম্নলিখিত ব্যবহার করি:

c := b
if a > b {
    c = a
}

মূলত @ নট_এ_গল্ফারের মতো তবে টাইপ ইনফারেন্স ব্যবহার করে ।


4
একই ত্রুটির সাথে: স্পষ্টতই প্রতিসম প্রয়োজনের জন্য একটি অসামান্য সমাধান ব্যবহার করার সময় আপনি বোঝাপড়া জটিল করে তোলেন।
নেকড়ে

4
এবং অলস-মূল্যায়িত নির্মাণ হওয়া উচিত যেখানে একই স্থানে দু'টি শাখার মধ্যে একটি ব্যবহার করা হবে যেখানে একটি সর্বদা মূল্যায়ন করা হবে, কখনও কখনও উভয়ই (যার ক্ষেত্রে প্রথম মূল্যায়ন অপ্রয়োজনীয় ছিল)
ব্রুস

4
ব্যবহারের ক্ষেত্রে নির্ভর করে এটি এখনও খুব কার্যকর হতে পারে। উদাহরণস্বরূপ listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }উত্পাদনের জন্য ত্রিনিদী হিসাবে একই গতি, এবং imho বেশ ভাল পাঠযোগ্যতা ability
লেবীয়

আমি সাধারণত কাঁদি যখন ইচ্ছাকৃত সিপিইউ চক্র।
আলেসিয়াসাভি

31

অন্যরা উল্লিখিত হিসাবে, Goটের্নারি ওয়ান-লাইনারগুলিকে সমর্থন করে না। তবে, আমি একটি ইউটিলিটি ফাংশন লিখেছি যা আপনাকে যা চান তা অর্জনে সহায়তা করতে পারে।

// IfThenElse evaluates a condition, if true returns the first parameter otherwise the second
func IfThenElse(condition bool, a interface{}, b interface{}) interface{} {
    if condition {
        return a
    }
    return b
}

আপনি কীভাবে এটি ব্যবহার করতে পারেন তা দেখানোর জন্য এখানে কয়েকটি পরীক্ষার কেস দেওয়া আছে

func TestIfThenElse(t *testing.T) {
    assert.Equal(t, IfThenElse(1 == 1, "Yes", false), "Yes")
    assert.Equal(t, IfThenElse(1 != 1, nil, 1), 1)
    assert.Equal(t, IfThenElse(1 < 2, nil, "No"), nil)
}

মজা করার জন্য, আমি আরও দরকারী ইউটিলিটি ফাংশনগুলি লিখেছি যেমন:

IfThen(1 == 1, "Yes") // "Yes"
IfThen(1 != 1, "Woo") // nil
IfThen(1 < 2, "Less") // "Less"

IfThenElse(1 == 1, "Yes", false) // "Yes"
IfThenElse(1 != 1, nil, 1)       // 1
IfThenElse(1 < 2, nil, "No")     // nil

DefaultIfNil(nil, nil)  // nil
DefaultIfNil(nil, "")   // ""
DefaultIfNil("A", "B")  // "A"
DefaultIfNil(true, "B") // true
DefaultIfNil(1, false)  // 1

FirstNonNil(nil, nil)                // nil
FirstNonNil(nil, "")                 // ""
FirstNonNil("A", "B")                // "A"
FirstNonNil(true, "B")               // true
FirstNonNil(1, false)                // 1
FirstNonNil(nil, nil, nil, 10)       // 10
FirstNonNil(nil, nil, nil, nil, nil) // nil
FirstNonNil()                        // nil

আপনি যদি এগুলির কোনও ব্যবহার করতে চান তবে আপনি সেগুলি এখানে পেতে পারেন https://github.com/shomali11/util


12

সঠিক উত্তরের দিকে নির্দেশ করার জন্য ধন্যবাদ।

আমি সবেমাত্র গোলং এফএকিউ (দুহ) পরীক্ষা করেছি এবং এতে স্পষ্টভাবে বলা আছে, এটি ভাষায় উপলভ্য নয়:

গোতে কি আছে ?: অপারেটর?

গো তেমন কোনও ত্রৈমাসিক রূপ নেই। আপনি একই ফলাফল অর্জন করতে নিম্নলিখিত ব্যবহার করতে পারেন:

if expr {
    n = trueVal
} else {
    n = falseVal
}

অতিরিক্ত তথ্য পাওয়া গেছে যা এই বিষয়ে আগ্রহী হতে পারে:


এটা এক লাইন এ সম্ভব: var c int; if a > b { c = a } else { c = b }? তবে আমি এটি পাঠক বিনোদনের জন্য একটি হালকা ব্লক গঠনের জন্য এটি 5 টি লাইনে রাখার পরামর্শ দেব;)
ওল্ফ

7

একটি সম্ভাব্য উপায় একটি মানচিত্র, সহজ কিনা আমি খুঁজে দেখছি ব্যবহার করে মাত্র এক লাইনে এই কাজ করতে a > bযদি তা না হয় trueআমি বরাদ্দ করছি cকরার aঅন্যথায়b

c := map[bool]int{true: a, false: b}[a > b]

তবে এটি আশ্চর্যজনক দেখাচ্ছে তবে কিছু ক্ষেত্রে এটি মূল্যায়নের আদেশের কারণে সঠিক সমাধান হতে পারে না। উদাহরণস্বরূপ, যদি আমি যাচাই করে দেখছি যে কোনও বস্তু এটি nilথেকে কিছু সম্পত্তি না পেয়েছে কিনা, নীচের কোড স্নিপেটটি দেখুন যা panicক্ষেত্রে হবেmyObj equals nil

type MyStruct struct {
   field1 string
   field2 string 
}

var myObj *MyStruct
myObj = nil 

myField := map[bool]string{true: myObj.field1, false: "empty!"}[myObj != nil}

কারণ শর্তটি মূল্যায়নের আগে মানচিত্রটি তৈরি করা এবং তৈরি করা হবে তাই এর ক্ষেত্রে myObj = nilযদি কেবল আতঙ্ক হয়।

আপনি কেবল একটি সাধারণ লাইনে শর্তগুলি করতে পারেন তা উল্লেখ করতে ভুলবেন না, নিম্নলিখিতটি দেখুন:

var c int
...
if a > b { c = a } else { c = b}

4

টার্নারি অপারেটরের পরিবর্তে ল্যাম্বদা ফাংশন ব্যবহার করুন

উদাহরণ 1

সর্বোচ্চ int দিতে

package main

func main() {

    println( func(a,b int) int {if a>b {return a} else {return b} }(1,2) )
}

উদাহরণ 2

মনে করুন must(err error)ত্রুটিগুলি পরিচালনা করার জন্য আপনার এই ফাংশন রয়েছে এবং কোনও শর্ত পূরণ না হলে আপনি এটি ব্যবহার করতে চান। ( https://play.golang.com/p/COXyo0qIslP এ উপভোগ করুন )

package main

import (
    "errors"
    "log"
    "os"
)

// must is a little helper to handle errors. If passed error != nil, it simply panics.
func must(err error) {
    if err != nil {
        log.Println(err)
        panic(err)
    }
}

func main() {

    tmpDir := os.TempDir()
    // Make sure os.TempDir didn't return empty string
    // reusing my favourite `must` helper
    // Isn't that kinda creepy now though?
    must(func() error {
        var err error
        if len(tmpDir) > 0 {
            err = nil
        } else {
            err = errors.New("os.TempDir is empty")
        }
        return err
    }()) // Don't forget that empty parentheses to invoke the lambda.
    println("We happy with", tmpDir)
}

4
আকর্ষণীয় পদ্ধতির, এটি আরও জটিল ক্ষেত্রে কার্যকর হতে পারে। :)
thoroc

2

একটি খুব অনুরূপ নির্মাণ ভাষা উপলব্ধ

**if <statement>; <evaluation> {
   [statements ...]
} else {
   [statements ...]
}*

*

অর্থাত্

if path,err := os.Executable(); err != nil {
   log.Println(err)
} else {
   log.Println(path)
}

2

কখনও কখনও, আমি একই লাইনে ঘটে সংজ্ঞা এবং নির্ধারণের জন্য বেনাম ফাংশন ব্যবহার করার চেষ্টা করি। নীচের মত:

a, b = 4, 8

c := func() int {
    if a >b {
      return a
    } 
    return b
  } ()

https://play.golang.org/p/rMjqytMYeQ0


এটি আরও জটিল ক্ষেত্রে +1 এ কার্যকর হতে পারে।
টম এল

0

আপনি এটির জন্য একটি ক্লোজার ব্যবহার করতে পারেন:

func doif(b bool, f1, f2 func()) {
    switch{
    case b:
        f1()
    case !b:   
        f2()
    }
}

func dothis() { fmt.Println("Condition is true") }

func dothat() { fmt.Println("Condition is false") }

func main () {
    condition := true
    doif(condition, func() { dothis() }, func() { dothat() })
}

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

বা এমনকি একটি সংক্ষিপ্ত সংস্করণ, একজন মন্তব্যকারী হিসাবে কেবল প্রস্তাবিত:

func doif(b bool, f1, f2 func()) {
    switch{
    case b:
        f1()
    case !b:   
        f2()
    }
}

func dothis() { fmt.Println("Condition is true") }

func dothat() { fmt.Println("Condition is false") }

func main () {
    condition := true
    doif(condition, dothis, dothat)
}

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


সংক্ষিপ্ত সংস্করণdoif(condition, dothis, dothat)
ভেলোটিস

4
হ্যাঁ, এটি আরও খাটো হবে, কেবলমাত্র কার্যগুলি অতিক্রম করবে passing কেবলমাত্র একটি ইউটিলিটি লাইব্রেরিতে একবারে এই ফাংশনটি রাখতে হবে এবং আপনি আপনার কোডের মাধ্যমে এটি সমস্ত ব্যবহার করতে পারেন।
লুই সুমিরনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.