Scala向char变量添加值

Scala向char变量添加值,scala,Scala,我正在用Scala创建一个简单的函数 def addOne(m: Int): Int = m + 1 将其与整数一起使用正常工作,使用double会引发类型不匹配错误 addOne(2) = 3 addOne(2.1) = error: type mismatch 当我将它与双引号中的字符一起使用时,它会抛出预期的类型不匹配 addOne("z") = error: type mismatch 但是,当使用单引号字符时,它会返回该字母的值 addOne('z') = 123 这里发生了什

我正在用Scala创建一个简单的函数

def addOne(m: Int): Int = m + 1
将其与整数一起使用正常工作,使用double会引发类型不匹配错误

addOne(2) = 3
addOne(2.1) = error: type mismatch
当我将它与双引号中的字符一起使用时,它会抛出预期的类型不匹配

addOne("z") = error: type mismatch
但是,当使用单引号字符时,它会返回该字母的值

addOne('z') = 123
这里发生了什么,为什么会这样?

这是因为
addOne(m:Int)
[冒号(:)后面的部分]告诉Scala您将向它传递Int,而不是Double,而不是其他任何东西

如果你想让它双倍工作,试试这个,但你总是会得到双倍的结果

def addone (m : Double ) =  m+1
addone: (m: Double)Double

scala> addone(1)
res0: Double = 2.0

scala> addone(1.1)
res1: Double = 2.1

Scala使用。所以,
'z'
被映射到122,这是一个整数。在方法中,
addOne('z')
将输入参数转换为整数(即122)

但是,
addOne(2.1)
中的输入参数是2.1,这是一个双精度参数,
addOne(“z”)
中的输入参数是一个字符串。它们不能自动转换为整数。

def addOne(m:Int):Int=m+1
只接受
m

它还可以处理单个带引号的字符(
z
),因为它被转换为ASCII值。“z”的值为122,加上1

scala>valfoo:Int='z'
foo:Int=122

scala>val bar=foo+1
bar:Int=123


如果您想使用double,可以指定
defaddone(m:double):double=m+1
可以使用
Char
作为函数的参数,该函数使用
Int
是因为Scala执行了从
Char
Int
的隐式转换。此特定转换在
Char
类的伴随对象中定义。请看这里:

$.html(似乎在$character处断开了此链接。改为复制粘贴)

执行转换的函数称为
char2int
。它将
Char
转换为相应的Unicode值,作为
Int

当Scala编译器发现类型
Char
Int
不匹配时,它将首先检查是否存在任何可用的隐式转换。如果没有找到任何错误,它只会给出一个编译错误。如果找到隐式转换,它将把该函数调用插入到代码中。因此,您的代码将转换为:

addOne(Char.char2int('z'))
例如,如果要将自己的隐式转换为,让函数接受
字符串
,可以定义:

// Enable implicit conversions.
import scala.language.implicitConversions

// The "implicit" modifier is the important part here, not the name of the function.
implicit def string2int(s: String) = s.toInt
现在编制如下:

// This returns 6
addOne("5")

/* 
 * This throws a NumberFormatException due to my implementation of string2int.
 * Create your own implementation of string2int if you want it to work properly.
 */
addOne("a")

最后:注意隐式转换非常强大,因此可能很危险!请参阅ArchetyPalpaul的注释以获取解释。

单引号发生了什么?单引号将转换为ASCII表示形式a’是97岁,b’是98岁,依此类推。。如果使用双引号,则它是一个字符串,不会转换为ASCII表示形式。如果你想了解更多信息,可以用谷歌搜索ASCII。但你还没有回答为什么会转换成ASCII。所以我觉得这个答案是相当不完整的事实上,这是更加错误的。单引号值并不是转换为ASCII。当且仅当
Int
值作为参数时,Char值才会隐式转换为Int。任何
Char
值都将被转换,而不仅仅是单引号中包含的文本。如果定义了
addToChar(c:Char)
,则
addChar('z')
将收到一个Char值,而不是122的相应
Int
。将1添加到Double后返回整数不是一个好做法。这会导致精度下降。你说得对。简单的复制/粘贴错误!我修正了它,谢谢。“因为它被转换成ASCII值”是的,但这只是说明它是有效的,因为它是有效的。有趣的答案是为什么它会被转换成ASCII值。这并不能真正解释为什么Scala编译器会接受一个
Char
值到一个取
Int
的函数中。没有自动“映射”到正在发生的ASCII值。这是一种隐式转换。看看我的答案。@marstran我的意思是“z”根据ASCII表映射到122,而不是
map
函数或与Scala有关的任何东西。你是对的,Scala隐式地将字符类型转换为整数……我们得到了唯一完整正确的答案。额外的学分:D,你可以展示如何将一个隐式的从字符串添加到Int,从而使其工作?向上投票anyway@TheArchetypalPaul很好的建议,修正了。它非常强大,很容易让你自暴自弃。因此,虽然这是一个很好的解释,但对广泛使用的类型(如
String
)进行隐式转换通常不是一个好主意,因为隐式转换可能会在您不需要它时生效。例如,使用@marstran的
String
implicit,您可能会键入错误的引号,调用
addOne(“9”)
,并从
addOne(“9”)
获得与您期望的结果不同的结果,并且编译器不会向您发出任何警告。就个人而言,我甚至不相信标准的
Char
->
Int
一个是个好主意…@TheArchetypalPaul我完全同意。必须在导入时启用它们是有原因的。