質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Q&A

解決済

3回答

666閲覧

scalaのfilter「(!_」の意味がわかりません。

MataSema

総合スコア15

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

0グッド

0クリップ

投稿2021/08/07 08:16

scala初心者です。

scalaの記号について質問がございます。

以下の記事例 にて、
https://jyuch.hatenablog.com/entry/2017/11/01/000000

以下の内容が出てきてます。
.filter(.isTerm)
.filter(!
.isMethod)

この !_ たまに、見かけることがあります。

このfilterが、boolean型でtrue,falseを返すとしていると理解していますが、

!_は、意味はどういう意味になるのでしょうか?

この場合、
isMethodの関数がtrueを返すとしたら、
!でその逆の判定となり,falseの判定になるとかそんな感じでしょうか?

(無知ですみません。)

また、大変、恐縮なお願いなのですが、
scalaは、独自記号が多く、
記号の意味がわからないものが多いです。

こういうscalaの記号の解説がわかりやすく書いてあるサイトがございましたら。ご紹介願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こういうscalaの記号の解説がわかりやすく書いてあるサイトがございましたら。ご紹介願います。

私にはこちらの記事が参考になりました。

ただし2016年の記事ですので、いまのScalaには当てはまらないところもあるかもしれません。注意してください。

この記事は 2016年07月03日 にQiitaへ投稿した内容を転記したものです。

記事には、この方がどうやって調べたかも書かれており、参考になりそうです。

とりあえずScalaの記号については、ソースコードをダウンロードして下記の正規表現でgrepしました。

`^[^*/]* (?:def|class|object|type|val) ([^0-9A-Za-z" ([]+)(?:[ ([]|$)`

基本、わからない記号見つけたら定義元に飛んで ((IntelliJはCtrl+B、EclipseはF3))、ソースを読んでます。(読んで理解できるとは言っていない)

  • IDEで定義元に飛べない記号(_*など)は、言語仕様の可能性が高いので言語仕様を読みましょう。

  • 記号の使用例がわからない場合、そのライブラリのテストコードを読むと良いケースがあります。

  • 急に()が出てきた場合、カリー化された引数かapply()です。apply()の場合、一時的に書き換えてショートカットキーで飛ぶか、検索してapply()の定義を確認します。

https://twitter.com/kmizu/status/724913410962558976

Kota Mizushima @kmizu Apr 26, 2016
記号がぐぐれない問題に関しては、 http://scala-search.org 使うと良いですよ(標準ライブラリ限定ですが役に立つと思います) #ichigayageek #scalajp

余談ですが、私はこの記事を大昔にQiitaで読んだのですが、タイトルにインパクトがあったので記憶に残ってました。「scala 記号みたい なんなの」で検索したところすぐに見つかりました。

投稿2021/08/07 23:41

tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MataSema

2021/08/10 04:05

丁寧に解説いただきありがとうございます。 こちらも参考になりました。 また何かありましたら、よろしくお願いいたします。
guest

0

ベストアンサー

!_は、意味はどういう意味になるのでしょうか?

!_じゃなくて!_は別々です。また、!_の結合より_isMethodの結合の方が強いので、
冗長な括弧を付けると!(_.isMethod)ということになります。_.isMethodの否定ですね。

こういうscalaの記号の解説がわかりやすく書いてあるサイトがございましたら。ご紹介願います。

「scala 演算子 一覧」とかで検索するのでしょうか。
_は、プログラミング以外の分野では記号ですが、全部では無いが多くの言語では英字の一種扱いで、変数名に使えます。

投稿2021/08/07 09:15

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MataSema

2021/08/07 15:33

とても丁寧に説明いただきありがとうございました。 理解ができました。 また何かございましたら、よろしくお願い申し上げます。
guest

0

すでに解決済みで正確な情報がでたあとですが、コメントさせてください。

filter 内で使われている _ はプレースホルダ構文と言われる
コードを短く書くためのシンタックスシュガーです。
.filter(!_.isMethod) は以下と同じになります。
.filter(v => !v.isMethod)
(filter で対象にする変数 v に対して直接操作するときに省略して書くことができる)
引数に関数形式で渡すことのできるメソッドに対して使うことのできる書き方です。

じゃあ「アンダーバースコア」は Scala ではすべてプレースホルダ構文なのかというと、
色々な意味で使われていて必ずしもそうではなくて厄介なところなのですが。
(パッケージインポートやパターンマッチのワイルドカード的な存在など)

_ のみに関していうと以下の内容がよくまとめて頂いていると感じています。
https://qiita.com/edvakf@github/items/0caeb282db18a1e65823

その他の記号に関しては、すでに上げて頂いておりますが、
定義に飛んで確認したり、ない場合はドキュメントを確認することになるかと思いました。

投稿2021/08/09 18:03

kiino

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MataSema

2021/08/10 04:03

丁寧に教えていただきありがとうございます。 そうなんです。アンダースコアが色々な意味で使われる。 アンダースコアで検索すると色々な情報が出てくるため、なかなか知りたい情報に辿りつかないのが scalaの厄介なところだと思いました。 上記のサイト、参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問