如何装饰斯卡拉int类具有自定义impicit转换为二进制字符串

问题描述:

我想用下面的方法:如何装饰斯卡拉int类具有自定义impicit转换为二进制字符串

def toBinary(i : Int, digits: Int = 8) = 
       String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0') 

,并把它变成一个隐式转换,以“装饰”阶诠释类,RichInt所以要实现以下目标:

3.toBinary  //> res1: String = 00000011 
3.toBinary(8) //> res1: String = 00000011 

而不是呼叫toBinary(3)

我怎样才能做到这一点?

[编辑] 寻找链接sugested我得到了它的工作原理

implicit class ToBinaryString(i :Int) { 
    def toBinary(digits: Int = 8) = 
       String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0') 
    } 

    3.toBinary(8)         //> res2: String = 00000011 

我不能没有默认参数,虽然使用下列项目后,我想能够写3.toBinary

+2

[Scala:如何创建一个允许我在调用它时使用点符号的函数?](http://*.com/questions/31621321/scala-how-can-i-create- a-function-that-allow-me-to-use-dot-notation-when-calli) – Yogesh

+2

你应该可以使用默认参数'3.toBinary()'。如果你想跳过括号,你必须添加另一个方法'def toBinary = toBinary(8)'并从第一个参数中删除默认参数。 –

object A extends App { 
    implicit class RichInt(i: Int) { 
    def toBinary(digits: Int = 8): String = 
     String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0') 
    } 

    println(3.toBinary(6)) 
} 

打印:

000011 

//编辑 如果你想打电话3.toBinary没有括号我想你必须提供一个方法不带参数:

object A extends App { 
    implicit class RichInt(i: Int) { 
    def toBinary(digits: Int): String = 
     String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0') 

    def toBinary: String = toBinary(8) 
    } 

    println(3.toBinary) 
    println(3.toBinary(6)) 
} 

这一个对我的作品,但我不斯卡拉专家,所以有可能做更好的方法。

+0

我制定了同样的解决方案请查看我对编辑 – firephil

+0

的评论是的。你必须编辑你的文章几秒后我的回答:) –

+0

我不能忽略默认参数,虽然没有编译器抱怨... – firephil