SlideShare a Scribd company logo
ゆるふわ
implicit parameter
1
自己紹介
for {
Type <- Person
Name <- Keigo Magma
Github <- k5jp1015
Job <- Server Side Engineer
Scala Experience <- 4 Month
Hobby <- Training(筋トレのことです♪)
} yeild Self Introduction(自己紹介)
2
implicitって?
• 以下の2つの機能を実現させるために使うよ
• 暗黙の型変換 ~ implicit conversion~
3
implicit parameterの使い所
• 共通の引数オブジェクトを使うメソッドが多いとき
!
外部サービスと連携するメソッドとかに多いよね
(*´∀`*)
4
認証情報取得
ファイルアップロード
ファイル削除
ファイルダウンロード
アプリケーション 外部ストレージ
5
ふつうな感じ
// 認証取得用メソッド定義
def getAuth(…) = {……}
// 外部ストレージからファイルをダウンロードするメソッド定義
def getFile(...., authObj: Authentication):File = {……}
// 外部ストレージのファイルを削除するメソッド定義
def deleteFile(...., authObj: Authentication):boolean = {……}
// 認証用オブジェクト取得
val authObj = this.getAuth(…)
// ファイルの取得
val file = this.getFile(...., authObj)
// ファイルの削除
val file = this.deleteFile(...., authObj)
6
implicit parameter使って
イイ感じ(-ω☆)キラリ
// 認証取得用メソッド定義
def getAuth(…) = {……}
// 外部ストレージからファイルをダウンロードするメソッド定義
def getFile(...., implicit authObj: Authentication):File = {……}
// 外部ストレージのファイルを削除するメソッド定義
def deleteFile(...., implicit authObj: Authentication):boolean = {……}
// 認証用オブジェクト取得
implicit val authObj = this.getAuth(…)
// ファイルの取得
val file = this.getFile(....)
// ファイルの削除
val file = this.deleteFile(....)
7
暗黙のパラメータを設定する事によって、
引数を書かなくても渡せるようになった
\(^o^)/
8
ん?
ちょっとまて。。
。
9
え?だから何?
別にソレが出来たから何なの??
どっちでもよくない???
( ゚д゚)ポカーン
10
ならばよろしい、見よ!
implicit parameterを用いた
メソッドの抽象度の高さを!!
(๑• ̀д•́ )✧+°
11
ここから、implicit parameterの本気!
しかし、説明は「ゆるふわ」
12
結果から教えるね♪
以下のようなメソッドが作れるよ!
• def check(value:T):Boolean
(今回はTは「String」「int」「Seq[String]」)
• valueがString型なら→「”true”」「”1”」「”正”」ならtrue
• valueがInt型なら→「1」ならtrue
• valueがSeq[String]型なら→「”true”」「”1”」「”正”」が一つで
も含まれればtrue
13
scala> val x = "正"
x: String = 正
scala> check(x)
res2: Boolean = true
scala> val x = 1
x: Int = 1
scala> check(x)
res1: Boolean = true
scala> val x = Seq("1","false","etc")
x: Seq[String] = List(1, false, etc)
scala> check(x)
res0: Boolean = true
String
Int
Seq(String)
14
実際にソースの説明を「ゆるく」、「ふわふわ」にし
ていきます
15
Step 1
trait Checker[A]{
def check(x:A):Boolean
}
型をつくる。
型を「A」としておくことによって、
様々な型を定義することができる
16
Step 2
object Checker{
implicit val stringChecker:Checker[String] = new
Checker[String] {
override def check(x: String) = {
x match {
case "true" | "1" | "正"=> true
case _ => false
}
}
}
implicit val intChecker:Checker[Int] = new Checker[Int] {
override def check(x: Int) = {
x match {
case 1 => true
case _ => false
}
}
}
implicit val seqStringChecker:Checker[Seq[String]] = new
Checker[Seq[String]] {
override def check(x: Seq[String]) = x.contains("true") ||
x.contains("1") || x.contains("正")
}
}
step1で用いた型に対して、
「String」「Int」「Seq[String]」の引数を
取るときの具体的な定義をしてあげる!!
17
Step 3
object activeChecker{
def check[A](x:A)(implicit C:Checker[A])
=C.check(x)
}
「A」という型をもつ引数とimplicit
parameterオブジェクトが必要だよ!
Cがもっているメソッドを引数xを使って実
行するよ!!
18
ゆるふわ説明まとめ(*´∀`
*)
def check 引数x
implicit
parameterな
引数オブジ
ェクトC
Step1で作成した型Checker
step2で作成したxがStringのときの定義
def check(x: String) = {
x match {
case "true" | "1" | "正"=> true
case _ => false
}
step2で作成したxがIntのときの定義
check(x: Int) = {
x match {
case 1 => true
case _ => false
}
step2で作成したxがSeq[String]のときの定義
check(x: Seq[String]) = x.contains("true") ||
x.contains("1") || x.contains("正")
=C.check(x)
19
まとめ
• implicit parameterを使って、暗黙的に引数を設定す
ることができるよ!
• implicit parameterを使って、抽象度の高いメソッド
をつくることができたよ!!
• implicit parameterを用いて、型クラスを定義すると
もっと抽象度の高い実装が可能になるよ!!!
(結構奥が深いから調べてみてね(-ω☆)キラリ)
20
まとめのまとめ
あんまり「ゆるふわ」では無かったかも
しれないけど、
ま、是非もないよネ( ゚д゚)
21

More Related Content

Similar to Scala 初心者向けlt

インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
Yosuke Hiraishi
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
Yuya Matsushima
 
Fluentdへようこそ
FluentdへようこそFluentdへようこそ
Fluentdへようこそ
Manabu Shinsaka
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
Yosuke HASEGAWA
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
Yoichiro Sakurai
 
認証サービスへのWebAuthnの導入
認証サービスへのWebAuthnの導入認証サービスへのWebAuthnの導入
認証サービスへのWebAuthnの導入
TakashiTsukamoto4
 
Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用
Lumin Hacker
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
 
S2s websrv201011-presen
S2s websrv201011-presenS2s websrv201011-presen
S2s websrv201011-presen
Kouhei Maeda
 
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
Masashi Shinbara
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
IIJ
 
Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方
Yuichi Hattori
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
Yusuke Suzuki
 
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)
Mariko Goda
 
AzureAD for Java
AzureAD for JavaAzureAD for Java
AzureAD for Java
Yoshio Terada
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法Naruto TAKAHASHI
 
Silex入門
Silex入門Silex入門
Silex入門
Takuya Sato
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
Photon運営事務局
 

Similar to Scala 初心者向けlt (20)

インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Fluentdへようこそ
FluentdへようこそFluentdへようこそ
Fluentdへようこそ
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
認証サービスへのWebAuthnの導入
認証サービスへのWebAuthnの導入認証サービスへのWebAuthnの導入
認証サービスへのWebAuthnの導入
 
Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
 
S2s websrv201011-presen
S2s websrv201011-presenS2s websrv201011-presen
S2s websrv201011-presen
 
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
 
Tokyo r30 beginner
Tokyo r30 beginnerTokyo r30 beginner
Tokyo r30 beginner
 
Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)
 
AzureAD for Java
AzureAD for JavaAzureAD for Java
AzureAD for Java
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
Silex入門
Silex入門Silex入門
Silex入門
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
 

Scala 初心者向けlt