我刚刚进入Ruby并且来自Java和C/C++环境.
在编写Ruby中的第一个小项目时,我不知何故习惯了让所有局部变量以下划线开头.我想我的主要动机是更好的可读性和方法调用的区别.
原则上只有三种类型的变量($global,@instance和local),绝大多数变量都以下划线开头.我不确定,这是好还是坏.此外,在很多其他语言中,下划线将被替换为其他一些字符.
有没有关于变量命名的最佳实践,除了通常的CamelCase和/或下划线分开?专业"红宝石"的习惯是什么?当我选择领先的下划线时,我是否忽略了一些常规的Ruby惯例?
编辑
感谢所有的答案和建议.这对我帮助很大.
以下答案和评论的简短摘要
(适用于短期访客)
领先的下划线与:
def my_method(_my_arg)my_array.each { |_x| puts _x}所有其他局部变量没有前导下划线,因为来自JavaScript的程序员可能会对变量的预期行为感到困惑.
对于变量名和方法调用之间的视觉分离,强制自己在所有方法调用中使用" ("括号" )" 可能会显着提高可读性.
前言
我刚刚开始深入研究Ruby,并尝试不仅学习语言,还尝试一些开发策略.作为初学者,我专注于测试和行为驱动开发.(是的,我这两个都是为了比较目的)
我正在使用我的小软件项目
在各个地方,我遇到RCov作为一个工具,告诉我我真正测试了多少我的实际代码.
我在我的设置中设置了以下RakeTask Rakefile用于UnitTests的covarage分析:
desc "Run RCov to get coverage of UnitTests"
Rcov::RcovTask.new(:rcov_units) do |t|
t.pattern = 'tests/**/tc_*.rb'
t.verbose = true
t.rcov_opts << "--html"
t.rcov_opts << "--text-summary"
t.output_dir = "coverage/tests"
end
Run Code Online (Sandbox Code Playgroud)
这工作正常,我得到了一个很好的彩色HTML报告coverage/tests.
问题简介
类似我为RCov编写了以下RakeTasks,用于我的规范的覆盖率分析:
desc "Run RCov to get coverage of Specs"
Rcov::RcovTask.new(:rcov_spec) do |t|
t.pattern = 'spec/**/*_spec.rb'
t.verbose = true
t.rcov_opts << "--html"
t.rcov_opts << "--text-summary"
t.output_dir = "coverage/spec"
end
Run Code Online (Sandbox Code Playgroud)
问题定义
但是,生成的HTML报告coverage/spec看起来有点不完整,几乎失败了.
所测试的方法体都没有标记为覆盖,因此是红色.但是,我100%确定它们是在规格范围内执行的.只有线条def method_name(args)和class ClassName标记为"绿色".(以及与之相符 …
使用"旧"Dojo,可以将第二个参数传递给Xhr请求ioargs的load函数(参见此处的示例6).这ioargs提供了(除其他外)请求的时间戳和状态代码.
但是,如何通过新的"更清洁"(和向前兼容)Dojo实现这一目标?
不幸的是,我在当前的文档中找不到任何提示.
以下应该是上面引用的"新"Dojo示例的端口.但是,ioargs将是未定义的:
require( "dojo/request/xhr", "dojo/dom", "dojo/domReady!",
function(request, dom){
// Look up the node we'll stick the text under.
var targetNode = dom.byId("getLicenseStatus");
// The parameters to pass to xhrGet, the url, how to handle it, and the callbacks.
request.get(
"{{dataUrl}}dojo/LICENSE",
{
handleAs: "text",
preventCache: true
}
).then(
function(data, ioargs){
// FIXME: ioargs is undefined
targetNode.innerHTML = "XHR returned HTTP status: " + ioargs.xhr.status;
},
function(error){
targetNode.innerHTML …Run Code Online (Sandbox Code Playgroud) 我是单元测试的新手,而不是C++的新手.最近我在使用RSpec的Ruby中进行了测试驱动开发的一些经验.现在我正在尝试使用Boost的单元测试框架在C++中进行类似的工作.
我正在/src项目的根文件夹下的目录中组织应用程序的头文件和源文件.正如我在其他C++程序中多次看到的那样/tests,在项目的根目录中的目录中进行测试似乎是合理的.
现在我想在测试中复制源文件的目录结构.因此,假设我有以下源/头文件结构:
/src
/controller
controller_class.h
controller_class.cpp
/model
model_a.h
model_a.cpp
model_b.h
model_b.cpp
/view
simple_view.h
simple_view.cpp
Run Code Online (Sandbox Code Playgroud)
因此,测试组织如下
/tests
TestRunner.cpp
/controller
controller_class_test.cpp
/model
model_a_test.cpp
model_b_test.cpp
/view
simple_view_test.cpp
Run Code Online (Sandbox Code Playgroud)
对于TestRunner.cpp我从这篇博文中的例子:
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "MyProgram Unit Tests"
#include <boost/test/unit_test.hpp>
Run Code Online (Sandbox Code Playgroud)
我现在想继续TestRunner.cpp创建基本测试套件(用于控制器,模型和视图),如下所示
BOOST_AUTO_TEST_SUITE ( controller )
//some stuff here
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE ( model )
//some stuff here
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE ( view )
//some stuff here
BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)
但是,我现在如何将更多嵌套测试套件和案例集成到这些顶级测试套件中?我终于希望实际的测试用例只出现在*_test.cpp文件中.虽然每个文件都将测试用例包装到一个额外的测试套件中:
TestRunner.cpp) …从FindBoost.cmakeCMake 3.8 的模块:
foreach(COMPONENT ${Boost_FIND_COMPONENTS})
if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT})
string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
if(Boost_${UPPERCOMPONENT}_FOUND)
if(Boost_USE_STATIC_LIBS)
add_library(Boost::${COMPONENT} STATIC IMPORTED)
else()
# Even if Boost_USE_STATIC_LIBS is OFF, we might have static
# libraries as a result.
add_library(Boost::${COMPONENT} UNKNOWN IMPORTED)
endif()
Run Code Online (Sandbox Code Playgroud)
重要的是要注意导入的目标与此模块创建的变量的行为不同:在同一目录中多次调用find_package(Boost)或具有不同选项的子目录(例如静态或共享)不会覆盖目标的值由第一个电话创建.
我看到了没有目标的理性GLOBAL.
然而,使它们成为全球化的首选方式是什么?
我习惯于在包含任何find_package(...)调用的子目录中定义项目的依赖项.因此,Boost导入的目标在另一个目录中不可用,例如/tests/CMakeLists.txt:
<project_root>
/3rdparty
/git-submodule-of-a-small-lib
/CMakeLists.txt
/include
/...
/tests
/CMakeLists.txt
/CMakeLists.txt
Run Code Online (Sandbox Code Playgroud) 我有一个自定义数据结构,其中char*包含两个相关长度的缓冲区:最大长度和实际长度:
struct MyData {
char* data;
int length;
int capacity;
};
Run Code Online (Sandbox Code Playgroud)
在Visual Studio(2015)调试器可视化工具中,我只想显示缓冲区的第一个length元素,data而不是(通常未初始化的)剩余元素.
我在自定义.natvis文件中有以下规则来显示我的自定义数据结构:
<Type Name="MyData">
<DisplayString>content="{data,su}" length={length}</DisplayString>
</Type>
Run Code Online (Sandbox Code Playgroud)
是否有可能只显示data为" su从"-encoded字符串data[0]来data[length-1]?
我写了一个小程序来计算前18个三元(x,y,z)有x<y<z,满足x^3+y^3=z^3+1.
我发现,在进行优化总运行时间的同时,使用double三次方程式和方程式的两侧比使用更快long.在我的机器上,差异大约是3秒.
现在我想知道为什么会这样.我猜它是在内部处理的某个地方,long而两个long变量的比较,因为这是唯一的,它在计算循环中发生变化.
这是我的代码:
class Threes {
public static void main(String[] args) {
System.out.println("Threes --- Java");
int Z_MAX = 60000, Y_MAX = Z_MAX-1, X_MAX = Y_MAX-1;
double[] powers = new double[Z_MAX+1];
for (int i = 0; i <= Z_MAX; i++) {
powers[i] = Math.pow(i, 3);
}
System.out.println("Powers calculated");
int x, y, z;
double right, left;
int[][] sets = new int[18][3];
int foundCount = 0;
long loopCount …Run Code Online (Sandbox Code Playgroud) 这是Perl的一个后续问题:在一行开头添加字符.
情况
在现有的Perl脚本中,我有一个合理的长字符串,$str其中包含未知数量的换行符(\n).现在在字符串的末尾有换行符.
$str = "Hello\nWorld.\nHow is it going?"
Run Code Online (Sandbox Code Playgroud)
问题
我想在字符串中每行的开头添加一定数量的(常量)空格:(在本例中为3)
$str = " Hello\n World.\n How is it going?"
Run Code Online (Sandbox Code Playgroud)
第一种方法 我的第一种方法是以下RegEx
$str =~ s/(.*?\n)/ \1/g;
Run Code Online (Sandbox Code Playgroud)
并缓存最后一行,它不是由新行终止的
$str =~ s/(.*)\n(.*)?$/\1\n \2/g;
Run Code Online (Sandbox Code Playgroud)
愿望
第一.以上几行完美无缺,完全符合我的意图.但.我知道,RegEx是强大的,因此我很确定,只需一个简短的RegEx就可以做同样的事情.不幸的是,我还没有实现这一目标.(这很有可能,我认为太复杂了.)
那么,人们对这个问题有什么可能性呢?
谢谢你的回答.
我有一堆关于随机引擎和分布、它们的成本和交互的问题:
std::random_device一个昂贵的(重型可构造的)对象吗?如果可能,我应该只为我的应用程序创建一个吗?RandomNumberDistribution对象昂贵的对象还是主要取决于具体的分布?在我看来,例如uniform_int_distribution应该是包含分布范围的非常轻的对象,[min, max]并且可能是(?)某种内部状态。random_device,random_engine和之间的交互如何distribution在下面的代码中工作:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distr(1, 10);
auto random_value = distr(gen);
Run Code Online (Sandbox Code Playgroud)最后一行会发生什么?分布从随机引擎获取下一个值,然后将其带到所需范围[0, 10]?总是很明显一些对象的内部状态应该在调用后修改:绝对random_device,random_engine但uniform_int_distribution也有一些内部状态?
我应该怎么做C++代码中的"签名/无符号不匹配"警告,如下所示:
for (int i = vector.size() - 1; i >= 0; --i) // OK
{
if (i < vector.size() / 2) // warning C4018: '<': signed/unsigned mismatch
// ...
}
Run Code Online (Sandbox Code Playgroud)
(一个人为的例子,但它证明了这个问题.)
如何处理"签名/未签名的不匹配"警告(C4018)?说要size_t用于循环变量,但是这对于终止于0的递减循环不起作用.它在没有警告的情况下编译,但是整数在运行时溢出(或者它是下溢?)并且变为4294967295.
c++ ×4
ruby ×2
boost ×1
c ×1
c++11 ×1
cmake ×1
dojo ×1
double ×1
java ×1
javascript ×1
long-integer ×1
natvis ×1
optimization ×1
perl ×1
rake ×1
random ×1
rcov ×1
regex ×1
rspec ×1
runtime ×1
unit-testing ×1
visual-c++ ×1