@scala_ru

Страница 196 из 1499
Nick
28.10.2016
14:17:50
m.chota() returns chota

Vladimir
28.10.2016
14:20:40
ты хочешь замокать результат метода? тогда делай val m = mock[YourImplicitClass]
аргументом в конструктор я это не могу передать уже

Mikhail
28.10.2016
14:25:14
лучше бы пример привел, а то пока не очень понятно в каком виде ты хочешь это использовать) потому что не очень понятно, почему при передаче в конструктор не можешь подменить имплисит класс. он ведь идет таким же обычным параметром и ты можешь его передать явно

Vladimir
28.10.2016
14:27:46
/*lib code*/ class Orig { def get(id: Int) = ??? } /*my code*/ implicit class OrigFix(o: Orig) { def getFixed(id: Int) = ??? } class UseCase(orig: Orig) { def foo = { orig.getFixed(123) } }

Google
Nick
28.10.2016
14:29:12
val m = mock[OrigFix] не работает?

Mikhail
28.10.2016
14:29:48
так ведь у тебя же будет работать этот код. или что ты хочешь?

Vladimir
28.10.2016
14:30:02
нет, т.к. new UseCase(mock[OrigFix]) скажет, что OrigFix это не Orig

Mikhail
28.10.2016
14:32:46
а что мешает тебе сделать class OtherFix(o:Orig){ def getFixed() } new UseCase(orig)(new OtherFix(orig))

или это опять не то, что ты хочешь?

тьфу, он же в параметрах не идет)

тут же явно не указан в этом классе

Nick
28.10.2016
14:33:51
а нельзя написать mock[OrigFix with Orig] ?

я прост не знаю, что там

хотя опять же тип не тот будет

Mikhail
28.10.2016
14:36:39
но честно говоря все равно не понятно, почему раз это твой код и ты хочешь мокнуть свой код - почему бы его просто не переписать)

Vladimir
28.10.2016
14:39:11
Google
Nick
28.10.2016
14:43:45
а если ты делаешь ew UseCase(mock[Orig])

что происходит

Mikhail
28.10.2016
14:47:22
так он же имплисит метод хочет мокнуть, оригинал то какой смысл мокать? компилятор будет все равно искать имплисит внутри UseCase и найдет OrigFix

Vladimir
28.10.2016
14:48:34
что происходит
вызывается OrigFix который импортится внутри UseCase. Т.е. я, конечно, могу замокать все методы Orig, которые там внутри вызываются, но уж больно их много

Vladimir
28.10.2016
14:49:34
да по ходу, действительно, проще задекорировать Orig и декоратор отдельным параметром передать

Nick
28.10.2016
14:49:35
так вот, если ты делаешь мок на оригинал, дальше компилятор не видит твоего имплисит метода?

Vladimir
28.10.2016
14:50:02
видит, не-мокнутый

Mikhail
28.10.2016
14:50:17
зависит от стадии мока, если она после линковки - уже не поможет) вызов уже будет разложен и слинкован

компилятор работает не с фактическим обьектом же, с а интерфейсом который в конструкторе указан

Vladimir
28.10.2016
14:51:18
так я и буду интерфейс декоратора юзать уже)

вообще это камень в огород play, которые pull request приняли месяца полтора назад, а в релиз он еще не попал

Nick
28.10.2016
14:55:44
а если в UseCase сунуть <: Orig

по сути твои имплисит класс эт совершенно другой класс

Vladimir
28.10.2016
14:57:07
а если в UseCase сунуть <: Orig
но OrigFix никак не будет <: Orig соответствовать

Mikhail
28.10.2016
14:58:37
переписать метод не переписывая исходник можно только манипуляцией байткодом

либо переписывай OrigFix, либо UseCase - таким образом чтобы он брал другой имплисит класс)

Vladimir
28.10.2016
15:01:35
Вот чем-то таким и займусь, спасибо)

Nick
28.10.2016
15:02:24
просто сделай class UseCase(orig: OrigFix)

Google
Nick
28.10.2016
15:02:27
и забудь)

Dmitry
28.10.2016
21:54:19
\o/

Timothy
28.10.2016
21:54:44
релиз без RC3

James Tiberius Kirk ?
28.10.2016
22:06:05
чатик был про нейронки, линк дайте позязя

Denis
28.10.2016
22:19:16
???

KrivdaTheTriewe
28.10.2016
22:29:26
Урааа

Ура

Alexey
29.10.2016
12:39:13
Знакомые все лица подтягиваются :) ?

Ivan
29.10.2016
13:07:17
кто нибудь юзает vertx?

Sergey Tolmachev
29.10.2016
14:37:17
кто тут силен в type bound и всякой этой магии? я решил попробовать познать иии... как мне сделать это? class A[CC <: C[A[C], _]] class B[CC <: C[AA, _], AA <: A[CC]] class C[AA <: A[C[AA,BB]], BB <: B[AA, C[AA,BB]]] https://scalafiddle.io/sf/hj8YZPc/0

то есть вопрос даже такой. я должен этого хотеть? это нормальный кейс или я делаю что-то не так?

Vladimir
29.10.2016
14:41:51
как-то все очень рекурсивненько

Sergey Tolmachev
29.10.2016
14:43:04
ну если первый зависит от третьего, второй от первого, а третий от первого и второго, то как это записать?

Oleksandr
29.10.2016
14:43:19
однозначно что-то делаешь не так type-level computations вообще опасные, а уж в не предназначенном для этого языке...

Sergey Tolmachev
29.10.2016
14:43:53
да я вот тоже начал думать, что вообще я зря все это затеял :)

Oleksandr
29.10.2016
14:44:09
а что сделать-то хочешь? (итоговый кейс)

Sergey Tolmachev
29.10.2016
14:44:37
некую гибкую валидацию в компайл тайме на уровне типов

ну на самом деле можно и проще, но будет не так гибко

я пытаюсь абстрактно описать предметную область блокчейна. Есть транзакция, блок и блокчейн. Есть транзакция типа блокчейна (как тип A в моем примере), блок включает в себя транзакции типа блокчейна (тип B), и сам блокчейн с этими типами транзакции и блока (тип C)

ну вот это я и хочу написать

Google
Sergey Tolmachev
29.10.2016
14:53:01
спасибо, прочту

Sergey Tolmachev
29.10.2016
14:56:29
я сам упарываюсь)

KrivdaTheTriewe
29.10.2016
14:56:48
Ну основа то какая

Давайте какую-нибудь библиотечку сделаем полезную нашей юзергруппой

Sergey Tolmachev
29.10.2016
14:58:42
я не понимаю вопроса) я работаю в wavesplatform и я решил попробовать изучить/применить type-level магию в нашем деле

Sergey Tolmachev
29.10.2016
14:59:31
ну и так я сталкивался с разными блокчейн системами и не видел ни одной библиотеки, которая могла бы их абстрактно описать

Sergey Tolmachev
29.10.2016
15:00:14
эм, у меня там много кого ?

KrivdaTheTriewe
29.10.2016
15:01:29
ну и так я сталкивался с разными блокчейн системами и не видел ни одной библиотеки, которая могла бы их абстрактно описать
Я к другому, я просто не занимался блокчейном никогда, только статьи уровня Хабрахабр читал на эту тематику читал, поэтому хотелось бы с теор основами ознакомится.

Sergey Tolmachev
29.10.2016
15:01:35
Я про блокчейн
ну тогда вероятно ответ - по сугубо моему опыту

на вики неплохая вводная https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B0_%D0%B1%D0%BB%D0%BE%D0%BA%D0%BE%D0%B2_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9

KrivdaTheTriewe
29.10.2016
15:02:27
:) ну на более глубоком уровне

Может блоги есть какие тематические

Sergey Tolmachev
29.10.2016
15:03:28
ну это как раз вся абстрактная инфа. более подробно в технических документнашках по каждой из блокчейн систем пишут

вот описание nxt (похоже на waves) http://wiki.nxtcrypto.org/wiki/Whitepaper:Nxt

KrivdaTheTriewe
29.10.2016
15:06:12
Спасибо большое

Sergey Tolmachev
29.10.2016
15:06:35
на самом деле есть наверное много хороших материалов по этой теме, но я особо не искал)

Google
Alex
29.10.2016
15:28:31
насчет криптовалют есть учебная реализация на скале кстати

https://github.com/input-output-hk/Scorex

Sergey Tolmachev
29.10.2016
15:30:16
да, и там все плохо. очень. совсем

я поспорил с одним из ее авторов, что напишу часть этой мешанины за выходные проще и понятнее :D проще и понятнее с type-level это я конечно загнул, но хотя бы корректнее будет

на самом деле они сами переписывают его в типа scorex 2.0, но мне кажется, что немало базовых недостатков там останется, потому что пишут больше не программисты с прикладной точки зрения, а ученые с научной точки :)

Dmitry
29.10.2016
16:40:40
Sergey Tolmachev я бы сюда заглянул http://gigiigig.github.io/tlp-step-by-step/introduction.html

Sergey Tolmachev
29.10.2016
16:41:21
я уже великолепно решил проблему с помощью path-dependent types, очень рад этому решению)

спасибо, до этого тоже как-нибудь доберусь

Dmitry
29.10.2016
16:41:53
Можно пример

Sergey Tolmachev
29.10.2016
16:42:37
ну в итоге я A и B перенес в C и все стало гораздо проще

trait BlockChain { abstract class BlockChainBlock extends Validable with Signable { type Id } abstract class BlockChainTransaction extends Validable with Signable with StateChangeReason type T <: BlockChainTransaction type B <: BlockChainBlock type A <: BlockChainAccount abstract class BlockChainAccount(val publicKey: Array[Byte], val privateKey: Option[Array[Byte]]) abstract class BlockChainAddress(val address: Array[Byte]) trait BlockChainSignedTransaction[V] extends BlockChainTransaction with Signed[T, V, Signature[V]] trait BlockChainSignedBlock[V] extends BlockChainBlock with Signed[B, V, Signature[V]] type TransactionValidator = AggregatedValidatorOnBlockchain[this.type, BlockChainTransaction, TransactionValidationError[this.type]] type BlockValidator = AggregatedValidatorOnBlockchain[this.type, BlockChainBlock, BlockValidatorError[this.type]] def genesis: BlockChainBlock def txValidator: TransactionValidator def blockValidator: BlockValidator }

как-то так. но я оно еще в процессе

path-dependent types = нестатические вложенные классы

KrivdaTheTriewe
29.10.2016
17:16:32
@fomkin что будет с юзергруппом то

Решил ?

Страница 196 из 1499