加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 打印集合:特定于变量

发布时间:2020-12-16 18:07:30 所属栏目:安全 来源:网络整理
导读:我有多维数组,其中维度保存在ArrayBuffer中. 当我打印它时,显然,我得到了ArrayBuffer(2,2,3),但我希望有2x2x3.我知道我可以按照以下方式执行println(multiarray.dim.mkString(“x”)). 通过简单发布println(multiarray.dim),我有没有“神奇”的方法获得2x2x3
我有多维数组,其中维度保存在ArrayBuffer中.

当我打印它时,显然,我得到了ArrayBuffer(2,2,3),但我希望有2x2x3.我知道我可以按照以下方式执行println(multiarray.dim.mkString(“x”)).

通过简单发布println(multiarray.dim),我有没有“神奇”的方法获得2x2x3?

编辑

dim是给出维度的多维数组的方法……

解决方法

如果dim返回一个ArrayBuffer,那么,不,你不能只使用println(multiarray.dim).以下是一些简单的替代方案:

>定义一个方法,将维度作为String返回(在多阵列类中):

def dimStr = dim mkString "x"

>定义用于打印的实用方法:

def printdim(buffer: ArrayBuffer[Int]) = println(buffer mkString "x")
// or
def printdim(multiarray: MultiArray) = println(multiarray.dim mkString "x")

推广toString:

通过更多的努力,您可以定义一个可以按照您喜欢的方式工作的println版本.我们的想法是抽象String-creation逻辑.这种方法的强大之处在于,一旦基础架构到位,您就可以通过将适当的隐式带入范围来控制任何类型的“字符串化”.

首先定义一个类型类:

trait Stringable[T] extends (T => String)

提供类型类的默认实现(它只是回到普通的toString方法):

class DefaultStringable[T] extends Stringable[T] { 
   def apply(x: T) = x.toString
}
object DefaultStringable {
   implicit def any2stringable[T]: Stringable[T] = new DefaultStringable[T]
}

为您的用例实现类型类:

implicit object DimIsStringable extends Stringable[ArrayBuffer[Int]] {
   def apply(buf: ArrayBuffer[Int]) = buf mkString "x"
}

定义使用类型类的print方法:

def myprintln[T](x: T)(implicit e: Stringable[T]) = e(x)

乐趣.

import DefaultStringable._
myprintln(ArrayBuffer(1,3)) // prints "ArrayBuffer(1,3)"

利润!

import DimIsStringable._
myprintln(ArrayBuffer(1,3)) // prints "1x2x3"

如果需要,您可以使默认类型类始终可用,而无需任何导入.为此,您将伴随模块中的转换提供给Stringable特征(如下所示).这样做的缺点是,如果您忘记导入适当的Stringable,您将不再有编译器错误提醒您.

object Stringable {
   implicit def any2stringable[T]: Stringable[T] = new DefaultStringable[T]
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读