당신은 일반적으로 단지 스칼라package object
에 type
의, val
의, var
들과 def
의를 추가해야합니다; class
es, trait
및 object
은 동일한 package
에 속하지만 별도로 정의됩니다. 이것은 전역 변수와 함수를 정의하는 수단입니다. 합니다 (자바 생태계는 정말 순수하게 글로벌 데이터와 함수의 개념을 지원하지 않기 때문에 스칼라 특별한 object
가 package object
되나에서 그들을 넣습니다.)
예를 들어
, 당신은 삼각법에 대한 패키지를 설계 할 말 별도 요소로 (별도의 파일에서 일반적으로 너무) 라이브러리에
/** My trig library. */
package object trig {
/** Type used to represent an angle in radian measure. */
type Angle = Double
/** Value of PI circle constant. */
val PI = 3.141592653589793
/** Calculate angle with specified `opposite` and `adjacent` length values.
* @param opposite Length of side opposite the angle in a right-angled triangle.
* @param adjacent Length of the side adjacent to the angle in a right-angled triangle.
* @return Angle in radians for specified `opposite` and `adjancent` values.
*/
def atan2(opposite: Double, adjacent: Double): Angle = {
// Etc...
}
// Etc...
}
모든 클래스는 동일한 패키지에 정의 될 수 있지만 : 작업은이 같은 것을 정의 패키지 오브젝트가있을 수 있습니다. 예를 들어 : 지금까지 테스트에 관한 한
package trig
/** A point in 2D space.
*
* @param x X-axis co-ordinate of this point.
* @param y Y-axis co-ordinate of this point.
*/
case class Point(x: Double, y: Double)
, 관련 코드가 수정 될 것으로 예상된다 얼마나 자주 당신이 그 코드에 대한 테스트를 작성 여부를 결정해서는 안된다. 오히려 그 코드가 무효하다는 결과를 고려해야합니다. 이 예제에서 trig.PI
이 올바른 값을 가지고 있는지 확인하는 테스트를 작성하는 것은 좋은 아이디어 일 수 있습니다 (실수로 또는 의도적으로 누군가의 값을 수정할 가능성을 지키지 않아도 됨). 마찬가지로 trig.atan2
함수에 대한 테스트 사례를 작성하려고합니다. (예를 들어, 0.0
인수 값 등 두 개를 전달하면 무엇을 반환합니까?)
package object
의 내용을 테스트 할 때 일반 코드에서와 같이 참조하면됩니다. 동일한 패키지에있는 코드에서 요소의 이름을 참조하기 만하면됩니다. 그렇지 않으면 패키지에 요소 이름 앞에 접두어를 사용해야합니다. 예를 들어 상기 정보
package trig
import org.scalatest.FunSpec
class PackageTest
extends FunSpec {
describe("trig global elements") {
// Test value of PI.
describe("PI") {
it("must have the correct value") {
assert(PI === 3.141592653589793")
}
}
// Test atan2 function.
describe("atan2") {
it("must return an angle of 0.0 radians if opposite and adjacent are both 0.0") {
assert(atan2(0.0, 0.0) === 0.0)
}
// Etc.
}
// Etc.
}
}
는 ...
this guide 참조