S-JIS[2011-01-09/2017-01-16] �ύX����

Scala Option�iSome�ENone�j

Scala��Option�́A�l�����b�v����i��ށj�N���X�B


�T�v

�����̏������ʁi�I�u�W�F�N�g�j��Ԃ����\�b�h�ɂ����āA�����ł��Ȃ���������Java�ł�null��Ԃ��悤�ɂ��鎖������B
������null���ƁA���̂܂܎g����NullPointerException�ɂȂ��Ă��܂��B

Scala�ł́A������������Option�N���X���g���B
Option�N���X�̎q�N���X�ɂ�Some�N���X��None�I�u�W�F�N�g������B
�Ԃ������l��Some�ɓ���ĕԂ��B
�����ł��Ȃ���������\���Ƃ���None��Ԃ��B

scala> def div(n: Int, m: Int) = {
     |   if (m != 0) Some(n / m) else None
     | }
div: (n: Int,m: Int)Option[Int]

scala> div(10, 5)
res1: Option[Int] = Some(2)

scala> div(1, 0)
res2: Option[Int] = None

Option�̃��\�b�h

Option�iSome�ENone�j�̃��\�b�h�B

���\�b�h�i��j �������� ���l
Some�̂Ƃ� None�̂Ƃ�
opt.isEmpty
false true �@
opt.isDefined
opt.nonEmpty
true false �@
opt.get
��������l NoSuchElementException������ �@
opt.getOrElse(�f�t�H���g�l)
�����Ă���l �w�肳�ꂽ�f�t�H���g�l �߂�l�̌^�́A�����Ă���l�ƃf�t�H���g�l�̋��ʂ̐e�N���X�ɂȂ�B
opt.orNull
�����Ă���l null AnyVal�iInt���j�������Ă���Some�ł͎g���Ȃ��B �i�R���p�C���G���[�j
opt.orElse(Option(�l))
�������g �w�肳�ꂽOption(�l) �@
opt.map(�֐�)
Some(�֐��̏�������) None Option�ɓ����Ă��钆�g��ϊ�����B[2017-01-16]
�֐���null��Ԃ��Ă�None�ɂ͂Ȃ�Ȃ��B
���R���N�V������map
opt match {
  case Some(v) => v
  case _       => "nothing"
}
��������l "nothing" �@
Option(�l)
Option.apply(�l)
�@ �l��null�ȊO����Some(�l)��Ԃ��B
�l��null����None��Ԃ��B�iScala2.8�ȍ~�̎d�l�炵���B[2011-06-12]�j
�inull��Ԃ��悤��Java�̃��\�b�h�̖߂�l��Option�ɂ������ꍇ�ɕ֗��j
Some(�l)
Some.apply(�l)
�@ Some(�l)��Ԃ��B
�l��null��������Anull��ێ�����Some���Ԃ�B
Some(�l1,�l2)�Ə����ƁA(�l1,�l2)�Ƃ����^�v�����l�ɂȂ�B
����́ASome.apply(�l1,�l2)�Ƃ����Ăяo���ł���
Some��apply()�͈�����1�‚̃��\�b�h�ł���B
Scala�ł�������1�‚̂Ƃ��͊ۊ��ʂ��ȗ��ł����̂�
�uSome.apply �l�v�Ɖ��߂���A�l�������^�v���ƌ��Ȃ����B

���̑���foreach�Efilter�Emap�Ƃ��������\�b�h�i�R���N�V�����Ɠ��l�j������B
��{�I��Some�̏ꍇ�������������BNone���Ɩ������BList�ŗႦ��΁ANone�͋󃊃X�g�iNil�j������B


���p��

Option���g�����R�[�f�B���O��B[2011-05-04]

��肽���� �P���ȍl���� �ǂ������ȕ��@ ���l
�l���L��Ƃ�������������B
[2011-04-10]
opt match {
  case Some(v) => println(v)
  case _ =>
}
opt.foreach { v =>
  println(v)
}
foreach���g���ƁA�l���L��Ƃ��iSome�̂Ƃ��j�������s�����B
�@
�l���L��Ƃ��͕ϊ����A�����Ƃ��̓f�t�H���g�l��Ԃ��B
[2011-05-04]
val r = opt match {
  case Some(v) => v.convert
  case _ => �f�t�H���g�l
}
val r = opt.map(_.convert).
  getOrElse(�f�t�H���g�l)
None��map�́i���������j���None��Ԃ��̂�
�Ō��getOrElse�Ńf�t�H���g�l���Ԃ�B
List����łȂ��Ƃ��͐擪�v�f�A��̂Ƃ��̓f�t�H���g�l��Ԃ��B
[2011-06-18]
val r = if (list.nonEmpty) list.head
  else �f�t�H���g�l
val r = list.headOption.
  getOrElse(�f�t�H���g�l)
headOption�́A�l������΂����Some�ɓ���ĕԂ��B�������None��Ԃ��B
null�ȊO�̂Ƃ��������\�b�h���Ăяo���A����ȊO�̂Ƃ���null��Ԃ��B
[2011-06-04]
if (v ne null) v.convert else null
Option(v).map(_.convert).orNull
�@
��������𖞂����Ȃ炻�̒l�A����ȊO�̓f�t�H���g�l��Ԃ��B
[2011-06-12]
if (v >= 0) v else -1
Some(v).filter(_ >= 0).
  getOrElse(-1)
�Q�l�F missingfaktor������c�C�[�g
v��AnyVal�iInt�Ƃ��j�Ȃ�null�ɂȂ邱�Ƃ͖����̂ŁAOption�łȂ�Some�ł����B
null�ȊO�̂Ƃ������������f���s���B
[2011-04-24]
if ((v ne null) &&
    (v���g�����������f)) {
  �`
}
if (Option(v).exists{ v =>
  v���g�����������f
}) {
  �`
}
v��null����Option(v)��None�ɂȂ�̂ŁAexists�́i���������j���false�ƂȂ�B
���\�b�h�̖߂�l��null�ȊO�̊ԁA���������s����B
[2011-06-04]
val br = new BufferedReader(�`)
var s = ""
while ({ s = br.readLine; s ne null}) {
  println(s)
}
val br = new BufferedReader(�`)
new Iterator[String] {
  var opt = Option(br.readLine)
  def hasNext = opt.nonEmpty
  def next() = {
    val r = opt.orNull
    opt = Option(br.readLine)
    r
  }
}.foreach { s =>
  println(s)
}
��Scala��Reader��������
�l�̂���I�v�V��������Seq�ɓ����B
[2011-05-04]
var seq = Seq.empty[A]
if (opt1.nonEmpty) {
  seq :+= opt1.get
}
if (opt2.nonEmpty) {
  seq :+= opt2.get
}
var seq = Seq.empty[A]
seq ++= opt1
seq ++= opt2
�useq :+= v�v�́useq = seq :+ v�v�������B
�u:+�v�͗v�f�𖖔��ɒlj����鉉�Z�q�B
�u++�v�̓R���N�V�������m���������鉉�Z�q�B
Option���R���N�V���������ƂȂ�B
val seq = opt1.toSeq ++
  opt2
val seq = (opt1 ++ opt2).toSeq

Scala�ڎ��֖߂� / �Z�p�����֖߂�
���[���̑��M��F�Ђ�����

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@

�@