我在Objective-C程序中有一个FoA的NSArray.我想调用每个Foo的doIt函数,但是,根据文档,NSArray的makeObjectsPerformSelector函数不允许修改原始Foos .当调用doIt时,doIt选择器为每个Foo更改m数据成员.如何在NSArray中的每个Foo上有效地执行此功能?
@interface Foo : NSObject {
NSString *m;
}
@property (nonatomic, retain) NSString *m;
-(void)doIt;
@end
Run Code Online (Sandbox Code Playgroud) def group_move(group, damper):
# Make a copy to test values
new = group
# See what the original group value is
print("Test = " + str(group.ctris[0].p1.x))
dr = some float
dx = some float
dy = some float
# Make changes to new
moveGroup(new, dr, dx, dy)
# See if those changes produce allowed values
if (off_board_check(new) == 1):
damper += 2.0
# Reset to original to try again
print("Test Here = " + str(group.ctris[0].p1.x))
group_move(group, damper)
else:
# If …
Run Code Online (Sandbox Code Playgroud) Martin Odersky的书"Scala编程"讲述了避免有副作用的方法.例如,以下方法具有写入标准输出流的副作用.
def printArgs(args: Array[String]): Unit = {
args.foreach(println)
}
Run Code Online (Sandbox Code Playgroud)
然后它说,更好的方法是定义一个格式化传递的args进行打印的方法,但只返回格式化的字符串,如:
def formatArgs(args: Array[String]) = args.mkString("\n")
Run Code Online (Sandbox Code Playgroud)
我不明白这两种方法在概念上是如何不同的.总之,我们的目标是打印一个字符串.如果我们不在目标方法中这样做,那么客户端代码会这样做,这意味着我们只是转移代码导致从一个地方到另一个地方的"副作用".
我有一个Scala
包,应该从上到下记录,尽管我希望它是纯粹的功能。有没有办法在不破坏功能风格的情况下实现日志记录?
我最近发布了一个关于>>
操作员的问题,因为尽管我已经阅读了 LYAH walk the linee 部分,但我的理解仍然存在一些差距。下面是我偶然发现的一些代码/MVE,因为它们引发了以下思考。我怎么能得到代码后面的输出?是否不会出现没有向绑定运算符提供参数的情况,因此无法str
连接任何参数,否则它们会使用>>=
定义中所示的绑定,并且结果不应该与预期的不相似结果如下:
import Control.Monad
import Data.List
data Value =
NoneVal
| IntVal Int
| ListVal [Value]
deriving (Eq, Show, Read)
data RErr = EBVar String | EBInt Int
deriving (Eq, Show)
newtype Compuptaton a = Computation {runComputation :: [(String, Value)] -> (Either RErr a, [String]) }
instance Monad Computation where
return a = Computation( \_ -> (Right a, []))
m >>= f = Computation(\env -> case runComputation m env of …
Run Code Online (Sandbox Code Playgroud) 我在C中编写的代码中使用运算符' - >'时得到了这种奇怪的副作用.我使用的指针 - > on,被改为有一些垃圾.
进一步来说:
我有以下结构:
typedef void* ListElement ;
typedef struct List_t* List ;
typedef struct Node_t* Node;
Struct Node_t {
ListElement data ;
Node next;
}
Struct List_t {
Node* head;
Node* current
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下内容时ListGetFirst()
,我得到了有线行为:
ListElement ListGetFirst(List list)
{
if( list == NULL || list->head==NULL)
{
return NULL;
}
list->current=list->head;
Node* head =list->head; // here is the problem
ListElement data = (*head)->data;
return data;
}
Run Code Online (Sandbox Code Playgroud)
当我使用调试器时,我发现指针列表 - >头部在标记的前述行上发生了变化.
我真的不知道为什么,而且我不知道' - >'会有副作用
提前致谢
side-effects ×6
scala ×2
c ×1
haskell ×1
linked-list ×1
monads ×1
nsarray ×1
objective-c ×1
pointers ×1
python ×1