如今,越来越多的注意力转向功能性编程的主要原因之一是多线程/处理的兴起以及FP专注于无副作用的无状态计算的优势,使得可扩展性毫不费力.
当然,在面向对象编程中,我们也可以转向无状态范例,其中所有对象永远不会变异状态.这可以是一种约定,或者甚至可能由语言隐式支持.例如,在对象字段和方法之间强制统一访问的语言中,简单地不允许setter方法就可以实现这一点.
那么,我的问题是,由于面向对象可以利用无状态而对于对象强制有状态,OOP是否有效地成为FP的超集?FP的任何其他优点/特性是否使多线程比OOP更实用?
哪些语言的消息传递语法类似于Smalltalk?Objective-C是我唯一熟悉的.具体地讲,我想知道是否存在任何其它的语言实现,其允许在类似形式的语法:[anObject methodWithParam:aParam andParam:anotherParam]具有其允许命名参数的方法定义部分的消息.
一般来说,我发现这种语法可以有助于更一致的方法名称,更清楚地显示方法的意图,并且你付出的字面价格通常是值得的.我很想知道是否有其他语言支持这一点.
syntax smalltalk language-design objective-c message-passing
有没有人知道Spring是否有任何扩展允许通过JSON(或其他任何格式)而不是XML配置其ApplicationContext?我在官方文档中找不到任何内容,但我想知道是否有任何其他开源扩展可以允许这样做.
为了清楚起见,我不是在谈论配置SpringMVC来设置基于RESTful JSON的Web服务或类似的东西,只是可以通过JSON而不是XML来进行Spring应用程序配置.
最近对Smalltalk的介绍启发了我对'纯'面向对象风格的应用和好处.我想以前看过的这红宝石的好处,尽管非对象的存在的取向if,unless等结构好像它没有通过随身携带的东西一路.
纯粹在这里,我说的是"一切都是对象"(包括通过块或类似的功能)和没有程序风格的流控制,而是在布尔和集合上使用流控制方法.
然而,即使在像Smalltalk这样的语言中,有些东西也很突出,因为它们不是面向对象的.例如,如果不使用特殊语法(:=而不是'is:'或类似方法)进行变量赋值似乎不可能,并且从函数返回值似乎需要^运算符,它似乎不属于对任何物体.
有没有更进一步的语言?
简单的问题.有谁知道为什么Interface Builder不允许在UI元素上应用自定义样式?为什么只能以编程方式执行此操作?
我可以看到自定义UIView子类可能有多难,但默认控件肯定只有IB提供的样式选项的一小部分,例如背景颜色或更改字体颜色.为什么会这样?有没有办法通过IB接近应用主题这样的概念?
我能够按照https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps上的说明将Flutter添加为对简单单视图应用程序的依赖,并显示FlutterViewController,但确实做到了对于依赖Flutter的可可触摸框架尝试相同的过程没有成功。
目前可以吗?我希望能够构建一个由Flutter提供支持的独立iOS SDK,而其他iOS应用程序可能会依赖该SDK,而无需直接依赖Flutter。
具体来说,当我尝试使用SDK方法时,Flutter导入无法解决,并出现与找不到Flutter模块导入有关的错误:
[Xcode构建错误] [1]] [1]error: no such module 'FlutterPluginRegistrant'
import FlutterPluginRegistrant
error: no such module 'Flutter'
import Flutter
Run Code Online (Sandbox Code Playgroud)
更新: 这些是我最初看到的错误日志,但是可以通过向Coppapods提供FlutterPluginRegistrant.framework和Flutter.framework来解决它们。这样,当我的主应用程序链接到包含flutter依赖项的FlutterSDK框架时,它的编译效果很好。我现在遇到的问题是设置FlutterViewController,它是FlutterEngine / FlutterDartProject指向flutterAssets / dartMain /包URL的框架内的正确路径。我不确定如何从框架中提取这些内容。
当我尝试__block从修改它的块外部访问(块可变)变量时,我遇到了一个奇怪的问题.这是一个非常好的玩具示例,我只是为了更好地理解块一般,但是目前我有一个控制器使用这个方法创建一个字符串,其内容NSDictionary使用NSDictionary的是enumerateKeysAndObjectsUsingBlock:
- (NSString*) contentsOfDictionary:(NSDictionary*)dictionary
{
__block NSString *content = @"";
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
NSString* contentToAppend = [NSString stringWithFormat:@"Object:%@ for key:%@\n", obj, key];
content = [content stringByAppendingString:contentToAppend];
NSLog(@"Content in block:\n%@", content);
}];
NSLog(@"Content out of block:\n%@", content);
return content;
}
Run Code Online (Sandbox Code Playgroud)
当我使用包含内容的字典运行此方法时:
Value Key
"Queen" "card"
"Hearts" "suit"
"10" "value"
Run Code Online (Sandbox Code Playgroud)
所述content变量块内的正确修饰和我与每次迭代的输出:
......内容:
Object:Queen for key:card
Run Code Online (Sandbox Code Playgroud)
......内容:
Object:Queen for key:card
Object:Hearts for key:suit
Run Code Online (Sandbox Code Playgroud)
......内容:
Object:Queen for key:card
Object:Hearts for key:suit …Run Code Online (Sandbox Code Playgroud) 我在使用scala插件在Mac OSX 10.6.8上使用IntelliJ IDEA 10.5.1 Community Edition时遇到了一些麻烦.我遵循这些说明,但每当我尝试运行简单的HelloWorld应用程序时,我都会收到此错误:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -Didea.launcher.port=7533 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 10 CE.app/bin -Dfile.encoding=UTF-8 -classpath /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/deploy.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/dt.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/javaws.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/jce.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/jconsole.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/management-agent.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/plugin.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/sa-jdi.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../Classes/alt-rt.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../Classes/alt-string.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../Classes/charsets.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../Classes/classes.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../Classes/jsse.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/../Classes/ui.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/apple_provider.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/dnsns.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/localedata.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/sunjce_provider.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/sunpkcs11.jar:/Users/A482930/IdeaProjects/ScalaPractice/out/production/ScalaPractice:/Users/A482930/scala/lib/scala-library.jar:/Users/A482930/scala/lib/scala-swing.jar:/Users/A482930/scala/lib/scala-dbc.jar:/Applications/IntelliJ IDEA 10 CE.app/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain HelloWorld
Exception in thread "main" java.lang.ClassNotFoundException: HelloWorld
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
我检查了模块设置,编译器库似乎设置正确.我正在使用的scala版本是带有IzPack安装程序的2.9.0.1.我试过可用的插件以及在2011年7月5日晚间下面列出两个IDEA插件这里.
而不是帮我解决我的具体问题,有没有人知道一步一步的教程实际上没有问题的配置类似于我的?只要他们工作,我就可以使用旧版本的scala甚至是IDEA.
这是此queston的扩展: 是否可以在Objective-C中创建"块"对象的类别.
基本上虽然似乎可以通过NSObject或NSBlock在块上创建类别,但我无法理解块如何能够自我评估.在上一个问题的答案中给出的例子:
- (void) doFoo {
//do something awesome with self, a block
//however, you can't do "self()".
//You'll have to cast it to a block-type variable and use that
}
Run Code Online (Sandbox Code Playgroud)
意味着有可能以某种方式将self转换为块变量,但是如何执行块本身呢?例如,假设我在NSBlock上做了一个类别,并且在一个方法中做了:
NSBlock* selfAsBlock = (NSBlock*)self;
Run Code Online (Sandbox Code Playgroud)
是否有任何消息可以发送给selfAsBlock以对块进行评估?
在Objective-C中发现块后,我才刚刚开始关注一阶函数和闭包.Java是另一种语言,我听说过关闭(或缺少关闭)以及匿名类如何弥补这一点.
我绝对可以看到闭包作为Objective-C中的块的优点,但匿名Java类有哪些局限性?他们在多大程度上"弥补"缺乏真正的封闭?
我仍然是Core Data的新手,我试图理解为什么它需要传递一个NSManagedObjectContext.据我了解,传递上下文需要让多个线程不会影响同一背景,但我也是印象是,这种模式有时被认为是一个反模式,因为注意到这里.
核心数据理论上可以以线程安全的方式实现,以避免使用这种模式吗?其他ORM(例如Ruby的ActiveRecord)如何避免这种模式?例如,CoreData无法实现per-NSManagedObject保存方法,例如在此扩展中.这个轻量级框架不处理多线程,但NSManagedObjects不能使用某种内部GCD队列来支持它,它们没有暴露内部上下文?
对不起,如果我错过了什么重大的.
multithreading core-data objective-c nsmanagedobjectcontext ios
我在做一些非常简单的事情上遇到了很多麻烦.我有一个viewController和一个subViewController,两者都有从nib加载的视图.为了澄清,父视图的大小为1024 x 748,而子视图中的subView为640 x 480.
在viewController的viewDidLoad中,我添加了subViewController的视图,如下所示:
[self.view addSubview:self.subViewController.view];
NSLog(@"subview.frame:%@",NSStringFromCGRect(self.subViewController.view.frame));
Run Code Online (Sandbox Code Playgroud)
日志输出:
subview.frame:{{0, 0}, {640, 480}}
Run Code Online (Sandbox Code Playgroud)
然后,为了测试一下,我使用setCenter尝试在同一位置重新定位父视图中的子视图,如下所示:
CGPoint newCenter = CGPointMake(0,0); //should stay at the same position..
[self.subViewController.view setCenter:newCenter];
NSLog(@"after changing center.subview.frame:%@",NSStringFromCGRect(self.subViewController.view.frame));
Run Code Online (Sandbox Code Playgroud)
日志输出:
after changing center. subview.frame:{{-320, -240}, {640, 480}}
Run Code Online (Sandbox Code Playgroud)
现在我感觉有些东西可能会被搞砸了,并且猜测它与弹簧和支柱/尺寸和位置选项有关.我只能猜到这是因为这是我对IB的最不了解的功能.
关于什么可能导致这个问题的任何其他想法?你们有没有关于如何在IB中设置viewcontrollers视图的一般提示,以便它们自动定位与其他viewcontrollers的视图一致?在设置之后,setCenter是动态移动它们的正确方法吗?
我决定尝试在Objective-C中使用块来控制流,并且遇到了一些内联调用多个块的问题.
我有一个OOBoolean,它是BOOL原语的包装器,并提供以下方法:
+ (id) booleanWithBool: (BOOL) boolPrimitive;
- (id) initWithBool: (BOOL) boolPrimitive;
- (void) ifTrueDo: (void (^) ()) trueBlock
ifFalseDo: (void (^) ()) falseBlock;
- (void) ifTrueDo: (void (^) ()) trueBlock;
- (void) ifFalseDo: (void (^) ()) falseBlock;
Run Code Online (Sandbox Code Playgroud)
我这样使用这个类没有问题:
OOBoolean* condition = [OOBoolean booleanWithBool: (1 + 1 == 2)];
id trueBlock = ^(){
NSLog(@"True.");
};
id falseBlock = ^(){
NSLog(@"False.");
};
[condition ifTrueDo: trueBlock ifFalseDo: falseBlock];
Run Code Online (Sandbox Code Playgroud)
我得到了"真实"的结果.但是在尝试此操作时我一直遇到语法错误:
OOBoolean* condition = [OOBoolean booleanWithBool: (1 + 1 == 2)];
[condition ifTrueDo:(void (^)()) …Run Code Online (Sandbox Code Playgroud)