小编Tor*_*örn的帖子

以下划线开头的局部变量是不错的做法?

我刚刚进入Ruby并且来自Java和C/C++环境.

在编写Ruby中的第一个小项目时,我不知何故习惯了让所有局部变量以下划线开头.我想我的主要动机是更好的可读性和方法调用的区别.

原则上只有三种类型的变量($global,@instancelocal),绝大多数变量都以下划线开头.我不确定,这是好还是坏.此外,在很多其他语言中,下划线将被替换为其他一些字符.

有没有关于变量命名的最佳实践,除了通常的CamelCase和/或下划线分开?专业"红宝石"的习惯是什么?当我选择领先的下划线时,我是否忽略了一些常规的Ruby惯例?


编辑
感谢所有的答案和建议.这对我帮助很大.


以下答案和评论的简短摘要
(适用于短期访客)

领先的下划线与:

  • 方法参数: def my_method(_my_arg)
  • 块参数:例如 my_array.each { |_x| puts _x}

所有其他局部变量没有前导下划线,因为来自JavaScript的程序员可能会对变量的预期行为感到困惑.

对于变量名和方法调用之间的视觉分离,强制自己在所有方法调用中使用" ("括号" )" 可能会显着提高可读性.

ruby naming-conventions

9
推荐指数
2
解决办法
7370
查看次数

用于RSpec 2的RCov没有正确检测覆盖范围?(不是Rails!)

前言
我刚刚开始深入研究Ruby,并尝试不仅学习语言,还尝试一些开发策略.作为初学者,我专注于测试和行为驱动开发.(是的,我这两个都是为了比较目的)

我正在使用我的小软件项目

  • UnitTest(TDD)
  • 黄瓜(BDD)
  • Rspec(TDD和BDD)

在各个地方,我遇到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标记为"绿色".(以及与之相符 …

ruby rake rspec rcov

8
推荐指数
1
解决办法
1141
查看次数

如何检索AMD化Dojo的XHR响应代码(+时间戳)?

使用"旧"Dojo,可以将第二个参数传递给Xhr请求ioargsload函数(参见此处的示例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)

javascript dojo xmlhttprequest

8
推荐指数
1
解决办法
5641
查看次数

如何使用Boost实现测试套件和案例的组织?

前言

我是单元测试的新手,而不是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) …

c++ boost unit-testing

6
推荐指数
1
解决办法
2894
查看次数

之后如何制作进口目标GLOBAL?

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)

cmake dependency-management

6
推荐指数
2
解决办法
853
查看次数

将natvis文件中char*的显示限制为特定长度

我有一个自定义数据结构,其中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]

c c++ visual-studio natvis visual-studio-2015

5
推荐指数
1
解决办法
909
查看次数

比较长的原因比比较双倍慢

我写了一个小程序来计算前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)

java double optimization runtime long-integer

4
推荐指数
1
解决办法
586
查看次数

在每行的开头添加空格数(在一个字符串内)

这是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就可以做同样的事情.不幸的是,我还没有实现这一目标.(这很有可能,我认为太复杂了.)

那么,人们对这个问题有什么可能性呢?
谢谢你的回答.

regex perl

4
推荐指数
1
解决办法
3118
查看次数

c++11随机引擎和分布交互和成本

我有一堆关于随机引擎和分布、它们的成本和交互的问题:

  1. std::random_device一个昂贵的(重型可构造的)对象吗?如果可能,我应该只为我的应用程序创建一个吗?
  2. RandomNumberDistribution对象昂贵的对象还是主要取决于具体的分布?在我看来,例如uniform_int_distribution应该是包含分布范围的非常轻的对象,[min, max]并且可能是(?)某种内部状态。
  3. 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_devicerandom_engineuniform_int_distribution也有一些内部状态?

c++ random c++11

2
推荐指数
1
解决办法
356
查看次数

"有符号/无符号不匹配"警告(C4018),循环递减

我应该怎么做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++ visual-c++

2
推荐指数
1
解决办法
840
查看次数