2012-03-06 9 views
3

最近、スカラを学ぼうとしています。Scalaへの最初のステップ

私は_オペレータと混乱します。 次のプログラムでどのように使用できますか?

また、このプログラムをどのように簡潔にすることができますか?

valの使用を促進することがわかりました。この場合、valbalanceにどのように使用できますか?事前に

private object Main { 

    def main(args: Array[String]): Unit = { 
    val acc1 = new PiggyBank(5) 
    acc1.printBalance 
    acc1 deposit 5 
    acc1.printBalance 
    acc1 withdraw 5 
    acc1.printBalance 
    } 
} 

private class PiggyBank(open_Bal: Int) { 
    var balance = open_Bal 
    def deposit(value: Int) = balance = balance + value 
    def printBalance = println(balance) 
    def iswithdrawable(value: Int) = balance >= value 
    def withdraw(value: Int) = { 
    if (iswithdrawable(value)) { 
     balance = balance - value 
    } 
    } 
} 

感謝:)

+0

私はN00Bスカラ座ですが、私は推測する、バランスが 'var'ことになりました。そして、 'var'は意図的にこのタスクのために作られていますので、あなたはそれを変更することができます。 – Nishant

+0

「_」についてのご意見はどうすれば利用できますか? – Shrey

+0

私はScalaに限られた能力しか持たず、強制しない限り '_'を使う場所を見つけることができませんでした。 – Nishant

答えて

9

あなたはおそらくここで百万の答えを得るつもりです:)しかし、あなたの質問の内容に基づいて、あなたは本を読む必要があります。 Programming in Scala 2nd Editionをお勧めします。私はそれを2度読んだことがあり、その過程で犬の耳とコーヒーが染まった。

私が言う理由は、Scalaがあなたに新しいパラダイムを提示し、ScalaにJavaコードを記述しているからです。これは初心者にとってはまったく問題ありませんが、あなたがそのようにしたいことを学ぶつもりはありません。この本はあなたにもっと学ぶための基礎を与える素晴らしいスタートです。

例えば、ここで私はあなたのコードに変更したいものです。

case class PiggyBank(balance: Double) { 
    def deposit(amount: Double) = PiggyBank(balance + amount) 
    def withdraw(amount: Double): Option[PiggyBank] = { 
    if (balance >= amount) Some(PiggyBank(balance - amount)) 
    else None 
    } 
    override def toString() = balance.toString 
} 

しかし、「なぜ」私はそのようにしたいと思う本当の問題であり、それはあなたが本当にする必要がある質問です答えた、と私は主張する。一言で言えば、不変でもう少し機能的です(これはおもちゃの例ですが、ここには改善の余地があります)。なぜそれで、なぜ気にしますか?本はこの本に答えます。

これを考えると、必要に応じて_ビットを使い始めることができます。たとえば:

val result = PiggyBank(500) withdraw 200 flatMap { _.withdraw(200) } 
println(result.getOrElse(0)) 

しかし、あなたは(私のような長いしばらく前に)最も初心者に似ている場合は、あなたが尋ねるつもりだ「なぜ地球上では、その方が良い??」。これはあなたがすばやくSOの投稿で見つけるつもりの答えではありません。私は何度も繰り広げることができますが、最終的にはそれをすでに行っている本があり、私よりも上手くやっているということです。アンダースコア/ワイルドカードについて

+0

Thnkあなたはそんなに..読んで、Scalaのプログラミング..知識を適用すると混乱していた。 – Shrey

+0

恐ろしい!いい物。それで、私が言うことができるのは、ちょうど時間を与えることです。 :)あなたは明らかに本の初期段階にいる。あなたが進むにつれて、より多くのものが明らかになります。ここでも、両方piggybanksは 'なぜこれほどは' false'されるように同じバランスが、 'if' evalutesを持っている... –

+0

はええ..私はこのコードが正常に動作し – Shrey

2

あなたは不変オブジェクトでvalを使用します。 PiggyBankは変更可能なので、変更可能な内部状態にはvarが必要です。

あなたは不変で、このよう(基本的にオブジェクトの状態を変更します各操作は、新しい不変オブジェクトを作成する)あなたの貯金箱を回すことができる:

class PiggyBank(val balance : Int) { 
    def deposit(value: Int) = new PiggyBank(balance + value) 

    def printBalance = println(balance) 
    def iswithdrawable(value: Int) = balance >= value 

    def withdraw(value: Int) = if (iswithdrawable(value)) new PiggyBank(balance - value) else this; 
    } 

ですから、この記述することができます。

object Main { 

    def main(args: Array[String]): Unit = { 
     val acc1 = new PiggyBank(5) deposit 5 withdraw 5 
     acc1.printBalance 
    } 
+0

ごとに1つのそれらを依頼する良いですか? – Shrey

+0

@Shreyはい。 :) .. – onof

+0

はそんなにありがとう新しい内部状態を持つ新しいオブジェクトを返す関数に内部状態を変更し、各動作を回し – Shrey

4

ここに_の必要はありません。 _は演算子ではなく、クロージャのパラメータのプレースホルダです。例えば。 foldLeftを整数のコレクションと呼ぶと、それらを合計してList(1,2,3,4).foldLeft(0)((x,y) => x + y)の代わりにList(1,2,3,4).foldLeft(0)(_ + _)と書くことができます。最初の_は2番目の例ではxで、2番目の例ではyです。

+1

I分かった.. !ありがとう.. :) – Shrey

1

、これらは有用である頻繁に慣用的なコードに遭遇した "_"、読み:

http://www.slideshare.net/normation/scala-dreaded

http://agileskills2.org/blog/2011/05/01/revealing-the-scala-magicians-code-expression/


階段VERSのためのブックインデックス。 2「_」のための7件のエントリーがあります。「識別子の」

「カリー化機能」、「実存のタイプ」、「関数リテラル」、

「import文」「一致式」と「デフォルトにフィールドを初期化します値」

http://www.artima.com/pins1ed/book-index.html#indexanchor


非常に占いコメント:は両方の用語とタイプレベルでプラスファーストクラスの関数に方法を強制する方法としてワイルドカードとして強調する。

http://lambda-the-ultimate.org/node/2808#comment-41717

+0

thnxx Gene .. :) – Shrey

関連する問題