LoginSignup
3
1

More than 5 years have passed since last update.

Go 言語でも (a==1 && a==2 && a==3) を true にしてみたい(クソリプ編)

Last updated at Posted at 2018-01-23

元ネタ: javascript - Can (a ==1 && a== 2 && a==3) ever evaluate to true? - Stack Overflow

これに対する Qiita 記事のまとめが以下。

結論から言うと思いつきませんでした orz 理由は Go言語では演算子をオーバーライドできないし暗黙的な型変換もできないため。まともでないやり方なら何かあるかもしれないが思いつかなかった。

ただ Perl での解

use strict;
use warnings;

my $a = 1;
my @a = (1, 2);
sub a { 3 };

if ($a == 1 and @a == 2 and &a == 3) {
    print "True!\n";
}

というのを見かけたので,こういう記述が許容できるのなら何とかなりそうである。すなわち channel を使って

package main

import (
    "fmt"
)

func main() {
    a := make(chan int)
    go func() {
        for i := 1; ; i++ {
            a <- i
            i %= 3
        }
    }()

    if <-a == 1 && <-a == 2 && <-a == 3 {
        fmt.Println("True!")
    }
    if <-a == 1 && <-a == 2 && <-a == 3 {
        fmt.Println("True!")
    }
}

すればよい 1。お後がよろしいようで。


  1. 余談だが a <- i<- は channel への送信を表す送信構文(send statement)のトークンで for 構文内の <-a<- は channel からの受信を表す受信演算子(receive operator)である。演算子なので式(expression)に含めることができる。 

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1