回读一些我的Scala代码,我注意到它是功能性或面向对象的.
实际上,我不知道如何调解不可变类型和纯函数所暗示的无副作用规则以及OO的前提,其中方法就地修改实例状态,这显然是副作用.
我正在研究的一个解决方案是使所有方法返回具有适当状态修改的当前实例的克隆.看起来很渴望,但在我决定对代码进行并列化时可能有所帮助,对吧?
混合这两种范式的最佳做法是什么?什么是平衡?
谢谢.
编辑:我将问题重新表述为更简单且更少域特定的问题:在下面的代码中,我想实现mplus函数,该函数结合了受特定字段存在约束的两个函数.结果函数应该受到两个字段的存在的约束.谢谢 !
import shapeless._, ops.record.Selector, record._, syntax.singleton._
def requiresIntervalKey[L <: HList](l: L)
(implicit sel: Selector.Aux[L, Witness.`"interval"`.T, Int]): Unit = {
println(sel(l))
}
def requiresPlatformField[L <: HList](l: L)
(implicit sel: Selector.Aux[L, Witness.`"platform"`.T, String]): Unit = {
println(sel(l))
}
def mplus = ??? // That is the function I'd like to implement. Eventually it will be the additive operator of a monoid
// needsBothFields: L <: HList -> (implicit) Selector.Aux[L, Witness.`"interval"`.T, Int] -> (implicit) Selector.Aux[L, Witness.`"platform"`.T, String] -> Unit
val needsBothField = …Run Code Online (Sandbox Code Playgroud) 我目前正在努力尝试使用rx实现tcp看门狗/重试系统,您的帮助将不胜感激.
有一个Observable,我想通过定期检查我们是否仍然可以写入套接字来获得一个Observable.很简单,我可以做这样的事情:
class SocketSubscribeFunc implements Observable.OnSubscribeFunc<Socket> {
private final String hostname;
private final int port;
private Socket socket;
SocketSubscribeFunc(String hostname, int port) {
this.hostname = hostname;
this.port = port;
}
public Subscription onSubscribe(final Observer<? super Socket> observer) {
try {
log.debug("Trying to connect...");
socket = new Socket(hostname, port);
observer.onNext(socket);
} catch (IOException e) {
observer.onError(e);
}
return new Subscription() {
public void unsubscribe() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
}
Observable<Socket> socketObservable …Run Code Online (Sandbox Code Playgroud)