「在线英语」 一把双刃剑:Scratch数据类型的隐式转化

零基础学英语

作者:小阿斌Scratch格物堂投稿,原文有删减。

我们首要看一下这个scratch代码,你们来说他建立吗?

其实这个末节的主题才是笔者动笔写这篇文章的首要动机。它来源于一位群友的问题。一个十分经典的问题。

看似没缺点

可是一运转整个脚本。。。

所以开端倒推哪个环节出了问题。

仍是没问题,true在参加比较运算时,真的是“true”吗?咱们想当然地认为true被转化成了字符类型。但不是字符类型还能是什么?在咱们其它编程语言中,往往用1表明true,0表明false。

测验1:

布尔类型(true)参数参加算术运算(+空字符)

测验2:

布尔类型(false)参数参加算术运算(+空字符)

这两个小测验足以证明,true被转化为数字类型时,会被转化为1;false在被转化为数字类型时,会被转化为0.在上文中的比较运算符的接连嵌套运用示例中,第2次其实是在比较1>1,成果自然是false了。至于为什么“气泡输出”会失效,这是由于“说xxx”这类积木会将参数转化为字符类型。

或许运用布尔值参加比较运算确实实用价值不高,一般在事例实战中不会这么用,只是需求了解其原因即可。可是笔者的确实确见过一种运用布尔值参加算术运算,奇妙使用数据类型隐式转化这个特色的事例。下面和读者朋友们共享一下。

首先用脚本把4个嫌疑人的口供用逻辑表达式表示出来:

1号:“不是我。”

2号:“小偷是3号。”

3号:“小偷是4号。”

4号:“3号在扯谎”

接着依据条件“4个嫌疑人中有且仅有1人在扯谎”,能够推导出定论:以上4个逻辑表达式中,有3个是建立的,有1个是不建立的。再结合上文中get的新技能:布尔值在被转化为数字类型时,true会被转化为1,false会被转化为0,不难得出以下定论:

4名嫌疑人中,有且仅有1人在扯谎,

最终要做的就只有一件事了:遍历,从小偷=1开端,逐一验证即可。

假如用哲学中的对立观来剖析数据类型的隐式转化这个问题的话,积木自身的品种、自身的参数类型是主要对立,居于主导位置,它决议数据将会被转化成什么类型;而参数的数据类型则是次要对立,位居隶属位置。假如积木自身的参数类型与实践参数类型不匹配,则会优先测验将其转化为自身的参数类型,一起统筹地“考虑”一下参数自身的“主意”,看看它是否“乐意”被转化为那品种型,若“不乐意”,则另做计划。

首要这样无疑对新手来说无疑是非常友爱的,易上手。不然动不动地给你报个错,假如对Scratch的数据类型不行了解的话,简直解决不了。那么现有的教育常识系统中又要多一块巨大却又对逻辑思维能力的提高不大且极为单调的内容了,这肯定是在“劝退”初学者。另一个长处便是,只需你的想象力满足丰厚,就能使用这个特色做出精妙的事例(条件是你要清楚地知道自己在做什么)。

可是隐式转化带来的负面影响也同样地显着。比较强类型的言语,Scratch在数据类型这方面来说显得不行谨慎。其次,和其他弱类型言语相同,隐式转化总是被打上“它们的存在将导致过错的发作”的标签。一如上文中的3>2>1。Scratch数据类型隐式转化所形成的BUG不计其数,细分下去品种繁复。而且就像他的姓名相同,非常荫蔽,极难排查,即便像上文中那样运用一般的debug办法,也很有可能会由于再次发作隐式转化而失效。