美文网首页
if(a==1 && a==2 && a==3),为true,你

if(a==1 && a==2 && a==3),为true,你

作者: 山已几孑 | 来源:发表于2021-09-01 09:39 被阅读0次

最近无意间看到一个有趣的帖子:

  var a = ???;
  if(a == 1 && a == 12){  
    console.log(a);
  }

这是一个JS社区抛出来的问题。第一眼看到这个问题的时候,感觉这似乎是一个无稽之谈,一个变量怎么可能会同时满足俩个条件呢!

不过后来深入思考一下,发现这类问题有点意思...

如果你也觉得不可能的话,一起随着文章看下去。你也会觉得有点意思~


上面是原文,原文还提供了JS和Java的解决方案,手痒,试着用Swift实现了一下

既然涉及了==, 所以方案基本都是重写==运算符,

  1. 直接重写Int的==,让1,2,3都相等
extension Int {
    static func == (lhs: Int, rhs: Int) -> Bool {
        if (1...3).contains(lhs), (1...3).contains(rhs){ return true  }
        return false
    }
}
var a = 1
if a == 1, a == 2, a == 3{
    print("true")
} else {
    print("failure")
}
  1. struct封装, 封装后涉及了一个问题:struct == Int 能否成立等式, 故采用了ExpressibleByIntegerLiteral,添加了一个struct的便利方法;==方法中,lhs和rhs都是let,无法改变,所以只能也采用contain的方式了

struct SA: Equatable, ExpressibleByIntegerLiteral {
    var a : Int
    init(integerLiteral value: IntegerLiteralType) {
        a = value
    }
    static func == (lhs: SA, rhs: SA) -> Bool {
        if (1...3).contains(lhs.a), (1...3).contains(rhs.a){return true}
        return false
    }
}
var a: SA = 1
if a == 1,  a == 2,  a == 3{
    print("true")
} else {
    print("failure")
}
  1. class封装,class就好用多了,因为class的属性可以被动态改变,所以在==操作时,动态给属性+1,达到同时满足判断;
class A: Equatable, ExpressibleByIntegerLiteral {
    var a : Int
    required init(integerLiteral value: IntegerLiteralType) {
        a = value
    }
    static func == (lhs: A, rhs: A) -> Bool {
        defer {  lhs.a += 1 } //++1
        let eq = lhs.a == rhs.a
        return eq
    }
}

三种方法肯定不止,也算不上好,看个乐子了;
其他的

  • 比如class中.a 肯定是使用了.a的get方法,可在get方法里面做文章;
  • 通过Runtime hook ==方法;
  • 或者直接把==改掉,咱不比较数值了,也能解决问题;
  • ...

相关文章

网友评论

      本文标题:if(a==1 && a==2 && a==3),为true,你

      本文链接:https://www.haomeiwen.com/subject/vqhxwltx.html