Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • 04:00

    xuwei-k on sbt-pgp-2.0.2

    (compare)

  • 04:00

    xuwei-k on master

    Update sbt-pgp to 2.0.2 (compare)

  • 04:00
    xuwei-k closed #157
  • 03:18
    nscala-time-bot[bot] review_requested #157
  • 03:18
    nscala-time-bot[bot] opened #157
  • 03:18

    nscala-time-bot[bot] on sbt-pgp-2.0.2

    Update sbt-pgp to 2.0.2 (compare)

  • Nov 28 16:32

    xuwei-k on Scala-3.0.0-M2

    (compare)

  • Nov 28 16:30

    xuwei-k on master

    add Scala 3.0.0-M2 (compare)

  • Nov 28 16:21

    xuwei-k on Scala-3.0.0-M2

    add Scala 3.0.0-M2 (compare)

  • Nov 23 19:51

    xuwei-k on sbt-1.4.4

    (compare)

  • Nov 23 19:51

    xuwei-k on master

    Update sbt to 1.4.4 (compare)

  • Nov 23 19:51
    xuwei-k closed #156
  • Nov 23 16:54
    nscala-time-bot[bot] review_requested #156
  • Nov 23 16:54
    nscala-time-bot[bot] opened #156
  • Nov 23 16:53

    nscala-time-bot[bot] on sbt-1.4.4

    Update sbt to 1.4.4 (compare)

  • Nov 23 16:52

    xuwei-k on master

    Update scala-steward.yml (compare)

  • Nov 19 22:20

    xuwei-k on master

    Update scala-steward.yml (compare)

  • Nov 19 15:27

    xuwei-k on master

    Scala 2.13.4 (compare)

  • Nov 19 03:57

    xuwei-k on master

    timeout-minutes: 10 (compare)

  • Nov 18 17:04

    xuwei-k on github_actions

    (compare)

seraph
@seraphr

言語仕様的にはこのあたりですね

https://scala-lang.org/files/archive/spec/2.13/02-identifiers-names-and-scopes.html
There are two different name spaces, one for types and one for terms. The same name may designate a type and a term, depending on the context where the name is used.

basashi
@basashi_code_twitter
確かに落ち着いて考えればobjectというキーワードが付くので、objectは型の定義ではないことは感じ取れますね
basashi
@basashi_code_twitter
==equalsに置き換えられるのでしょうか?equalsは同値性を調べるそうですが、
scala> class A
class A

scala> val a = new A
val a: A = A@3503cb9c

scala> val b = new A
val b: A = A@6a601152

scala> a == b
val res2: Boolean = false
こちらはなぜfalseになるのでしょうか
equalsが宣言されていないときはjava.lang.Object#equalsが呼ばれるのでしょうか?これはeqと同じですか?
seraph
@seraphr

参照型の==equalsの呼び出しになります。

equalsが宣言されていないときはjava.lang.Object#equalsが呼ばれるのでしょうか?これはeqと同じですか?

はい、その通りです。
参照型のデフォルトの実装は、同じインスタンスであるかどうかをチェックします。

basashi
@basashi_code_twitter
迅速な回答ありがとうございます。助かりました
basashi
@basashi_code_twitter
パターンマッチングで無視したいところにアンダースコアを使うのは慣例でしょうか?それともアンダースコアであると特別な機能があるのでしょうか?
seraph
@seraphr

意味があります。
https://scala-lang.org/files/archive/spec/2.13/08-pattern-matching.html#variable-patterns

_ によるパターンマッチは、変数パターンの一種です。
普通の変数パターンだと、同じ変数を一つのパターン内に複数回登場させることはできません。

scala> (1, 2) match {case (a, a) => println(a)}
                              ^
       error: a is already defined as value a

_でマッチさせると、マッチした値を後から参照することが出来ませんが、複数回登場させることが出来ます。

scala> (1, 2) match {case (_, _) => println("マッチ")}
マッチ
basashi
@basashi_code_twitter
なるほど、理解しました。コードまで示してくださってありがとうございます
basashi
@basashi_code_twitter
連投申し訳ないです。多分今日はこれで最後です笑
trait Shape {
  def sides: Int
  def perimeter: Double
  def area: Double
}

sealed trait Rectangular extends Shape {
  def width: Double
  def height: Double
  val sides = 4
  override val perimeter = 2*width + 2*height
  override val area = width*height
}
overrideをつけるか、つけないかが混在しているように見えます。(sidesはつけていないがareaはつけている)つける・つけないの区別は有るのでしょうか?
seraph
@seraphr

super typeで実装が無いval や def を実装する場合、overrideはつけてもつけなくても良いです。
super typeで実装が有るval や def を実装する場合、つけないといけません。
super typeに定義が無いvalやdefでoverrideをつけるとコンパイルエラーになります。

上記から、私は、実装の有無に関係なく、overrideをつけるようにしています(名前とかシグネチャとかをミスったり変わったりしたときにコンパイルエラーになってくれるので)


overrideにはstackable trait patternで利用するabstract overrideというのもありますが、とりあえず考えなくて良いと思います。

basashi
@basashi_code_twitter
読んでいても実装しているのがわかるので習慣的につけたいと思います。ありがとうございました。
basashi
@basashi_code_twitter
コードをbotに投げるのに苦戦してしまい、荒らしてしまいました。ごめんなさい。
import scala.annotation.tailrec
sealed trait IntList{

  def double:IntList = {

    @tailrec
    def loop(list:IntList, result:IntList):IntList =
      list match {
        case End => result
        case Pair(head, tail) => loop(tail, Pair(head*2, result))
      }
    loop(this, End)
  }
}

case object End extends IntList
final case class Pair(head: Int, tail: IntList) extends IntList

object Main {
  def main(args: Array[String]): Unit = {
    val example = Pair(1, Pair(2, Pair(3, End)))
    println(example.double)  
  }
}
Pair(6,Pair(4,Pair(2,End)))
という結果になってしまい、並び順が逆になってしまうのですが、これはheadを変化させない再帰関数をもう一度適用して、逆を逆で打ち消すしかないのでしょうか?もう少しスマートな解決策はありますか?末尾再帰にそこまでこだわらくても良いのでしょうか?
seraph
@seraphr
末尾再帰にすると、foldLeft的に処理するしか無いので、reverseするしか無い気がしますね。
scalaの標準ライブラリだと、一度mutableなデータ構造で(call stackを使わずに)データを作ってから、目的のimmutableなデータ構造に変換してたと思います
basashi
@basashi_code_twitter
そうなっちゃいますよね。ありがとうございました。Scalaでは何でもかんでも頑張ってでも末尾再帰にしたほうが良いのでしょうか?ケース・バイ・ケースですか?
seraph
@seraphr

私は癖で、書けるときは末尾再帰にしちゃいますけど、ほとんどのデータ構造・状況では素直な再帰で書いても問題起こらないんじゃないですかね?
Arrayとかにアクセスするループとかを再帰関数に変換するとか、Linked Listみたいな一直線な再帰構造に対する処理を再帰的に書くとかすると、末尾再帰にしないとstack overflow errorに成りうるので気にしたほうが良いですが、ほとんどの場合は標準ライブラリとかで定義されているコンビネータ使えば済むので。

極端な話、末尾再帰にするのが難しい(めっちゃ読みにくくなる)ループするアルゴリズムというのは存在していて、そういうのを無理に書くよりは、そのままwhileループで書いても良いと思います。

taka231
@taka231
play frameworkについての質問です。ログイン認証について、play frameworkでは色々なライブラリがあるようですが、ドキュメントがあまりなくどれが便利なのかがよくわかりません。
Toshiyuki Takahashi
@tototoshi

以前はplay2-authやsecure socialなどのライブラリを使ってる人が多かった印象ですが、その2つは最近はあまりメンテされなくなってしまいました。
最近もメンテされているライブラリで知っているのは https://www.silhouette.rocks/ です。(使ったことはないです。)

ライブラリを使わなくてもPlayのアクション合成の機能を使えばだいたいなんとかなると思うので、個人的にはそちらをおすすめします。
https://www.playframework.com/documentation/2.8.x/ScalaActionsComposition#Authentication

taka231
@taka231
ありがとうございます。