English 中文(简体)
功能与Schala的方法
原标题:Functions vs methods in Scala
  • 时间:2011-01-29 21:24:42
  •  标签:
  • scala

我正在注视Runar Bjarnason目前为Beginners制定功能方案,14:45 他界定了一种方法:

def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0

一、导 言

val isEven = isDivisibleBy(2)

将<代码>is Even界定为一种功能而不是一种方法的利弊?

页: 1 Scala Functions vs Methods as well as Scala的方法与功能之间的差别,我理解了语义上的差别,但我想知道,在这种情况下,是否有更深层的理由说明为什么一项功能可能比使用一种方法更可取:

def isEven = isDivisibleBy(2)
最佳回答

在一生中,职能与方法之间还有其他差异。 一般说来,一种简单的方法产生的间接费用低于一种功能(从技术上讲,是一种标有<条码>的物体。

但是,如果你试图不注意这些差异,并想到def,valvar,作为fields,有不同的语义词,那么它就只是def。 每次在<代码>val时评价一次。

因此,val isEven = isDivisibleBy(2), 在其定义期间,应打上isDivisibleBy(2),并分配isDivisibleBy(2)的结果。 缩略语 页: 1

def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0

<代码>2:,并分配最后表述的结果(在这种情况下只有一种表述):

val isEven: Int => Boolean = i => i % 2 == 0

def isEven on the other hand does no such evaluation and results in a call to isDivisibleBy(2) every time.

这意味着,在你执行守则时,isEven(11)在出现<代码>val时产生。

11 % 2 == 0

并且如果是<代码>def,则请注明。

isDivisibleBy(2)(11)

只有在评价<代码>后方可考虑 缩略语 你们的伤势得到了结果。

您可在<条码>中添加一些条码,以便发现差异:

def isDivisibleBy(k: Int): Int => Boolean = {
  println("evaluating isDivisibleBy")
  i => i % k == 0
}
问题回答

我要在此谈谈另一个问题。 本条将<代码>is Even定义为一种方法:

def isEven = isDivisibleBy(2)

并且将<代码>isEven界定为一种方法:

val isEven = isDivisibleBy(2)

In both cases, isEven is a method which, when called, return a function.

在第一种情况下,<代码>isDivisible(2) 每一次被称作。 甚至。 例如,<代码>isDivisible(2)三次:

def isEven = isDivisibleBy(2)
List(1,2,3).filter(isEven)

在第二种情况下,isDivisible(2)>一度(在施工时间,或该行在定义中执行时),该数值每次检索isEven。 The following example calls isDivisible(2) one time only:

val isEven = isDivisibleBy(2)
List(1,2,3).filter(isEven)

我认为,将<代码>is Even定义为val的主要做法是向受众表明,这一功能可以这样界定。 那么清楚的是,一项功能只是像其他一切照样的物体。 但是,在不分摊方案拟定方面,没有必要将职能写成<代码>val。

这种方法def isDivisibleBy (k: Int): Int => Boolean Return a function which take an Int (i) as para amount and Return a Boolean (i % k = 0).

<代码>val is Even = isDivisibleBy(2), 而另一方面,通过isDivisibleBy(2)将这一功能退回的一个领域。 如果您使用<代码>def而不是val 之后是可分的 采用方法,每次都使用“静脉”方法,但现在只用一次,结果储存在外地。

可以通过以下文字来实现同样的结果:def is Even(i: Int): Boolean = i % 2 = 0

我认为,例子就是,你可以履行其他职能,你可以把这些职能作为目标加以储存,然后将其称为传统上界定的方法。 上述法典也与相当相似,因此也可成为实例所显示的一件事(尽管它使用





相关问题
How to flatten a List of different types in Scala?

I have 4 elements:List[List[Object]] (Objects are different in each element) that I want to zip so that I can have a List[List[obj1],List[obj2],List[obj3],List[obj4]] I tried to zip them and I ...

To use or not to use Scala for new Java projects? [closed]

I m impressed with Twitter and investigating to use Scala for a new large scale web project with Hibernate and Wicket. What do you think about Scala, and should I use it instead of Java? EDIT: And, ...

Why does Scala create a ~/tmp directory when I run a script?

When I execute a Scala script from the command line, a directory named "tmp" is created in my home directory. It is always empty, so I simply deleted it without any apparent problem. Of course, when I ...

Include jar file in Scala interpreter

Is it possible to include a jar file run running the Scala interpreter? My code is working when I compile from scalac: scalac script.scala -classpath *.jar But I would like to be able to include a ...

Scala and tail recursion

There are various answers on Stack Overflow which explain the conditions under which tail recursion is possible in Scala. I understand the limitations and how and where I can take advantage of tail ...

热门标签