On Friday, January 21, 2011 05:18:15 tamir wrote: > or what's the differents between theese two: > void transactionalCreate(string filename) { > string tempFilename = filename - ".fragment"; > scope(success) { > std.file.rename(tempFilename, filename); > } > auto f = File(tempFilename, "w"); > } > and: > void transactionalCreate(string filename) { > string tempFilename = filename - ".fragment"; > auto f = File(tempFilename, "w"); > std.file.rename(tempFilename, filename); > }
scope(success) will be run _regardless_ of how you leave that scope (except for if an exepction is thrown). So, you can have one line with scope(success) and multiple return statements or breaks or continues or whatnot, and that scope(success) statement will be run in all cases. If you didn't use scope(success), then you'd have to duplicate that code at every point that the scope could be exited successfully. Now, if there's only one way to exit a particular scope successfully, then scope(success) is less useful. However, even in cases like that it can improve code maintanence and readability when it comes to stuff like resources. For instance, if you were to open a file at the beginning of a function, having a scope(success) statement immediately following it makes it clear that closing the function has been taken care of, whereas without the scope statement, you'd have to worry about putting it at the end of the function separate from where the file was opened. Having them together makes the code clearer. Now, a file isn't the best example, since you'd want success(exit) in that case, and the File struct std.stdio deals with it anyway through its destructor, but the example should give you the basic idea. - Jonathan M Davis