在构造函数中,经常会发生将参数转换为实例变量的情况。一个简单的方法是:
class A
def initialize a, b, c
@a, @b, @c = a, b, c
end
end
Run Code Online (Sandbox Code Playgroud)
但更简单的方法是:
class A
def initialize *args
@a, @b, @c = args
end
end
Run Code Online (Sandbox Code Playgroud)
但是我担心代码的速度,因为看起来后者的代码正在创建一个额外的数组args,而前一个代码并未创建该数组。从速度或效率的角度来看,坚持前者而不使用后者是更好的选择,还是没有区别?
我在ReactiveUI中使用内置的依赖项注入器/ splat注入器。
我有要传递其适用的数据存储库的构造函数。
在其他框架中,它仅对接口使用反射,并使用GetServices调用来满足那些构造函数要求。例如,目前我具有用于创建类的此辅助程序扩展方法:
/// <summary>
/// Helper class for having a object's constructor automatically assigned by a "GetService" request.
/// </summary>
/// <param name="resolver">The resolver.</param>
/// <param name="type">The type to register.</param>
public static void Register<TConcrete, TInterface>(this IMutableDependencyResolver resolver)
where TConcrete : class
{
var concreteType = typeof(TConcrete);
// Must be a single constructor
var constructors = concreteType.GetConstructors().Single();
IList<object> values = new List<object>();
foreach (var parameter in constructors.GetParameters())
{
if (parameter.ParameterType.IsInterface == false)
{
throw new InvalidOperationException($"The type {concreteType.Name} has …Run Code Online (Sandbox Code Playgroud) 我已经 通过Ruby样式指南跟踪了Ruby的"为什么(Poignant)指南",以及Ruby教程如何思考.但这是我第一次看到尾随下划线.这些是什么东西?它们是否有用,如果是,我们何时使用它们以及如何将它们与splat运算符一起使用?
(Ruby样式指南链接锚定到实际示例)
我正在分配一个像这样的数组常量:
NUMS = *(2..9)
Run Code Online (Sandbox Code Playgroud)
Rubocop说
C:冻结分配给常量的可变对象. NUMS
=*(
2..9 )^^^^^
所以我试试
NUMS = *(2..9).freeze
Run Code Online (Sandbox Code Playgroud)
Rubocop说
C:冻结分配给常量的可变对象.
NUMS =*(2..9).freeze
^^^^^^^^^^^^
试着
NUMS = (*(2..9)).freeze
Run Code Online (Sandbox Code Playgroud)
Rubocop说
E:意外的令牌tRPAREN(使用Ruby 2.0解析器;在AllCops下使用TargetRubyVersion参数配置)NUMS
=(*(2..9)).冻结
^
试着
NUMS = [1, 2, 3, 4, 5, 6, 7, 8, 9].freeze
Run Code Online (Sandbox Code Playgroud)
Rubocop说
== happy_robot_dance(没有错误)
我说
键入1,2,3,... 9,我的手会受伤
有没有办法使用splat分配和冻结常量?
解决方案
NUMS = (2..9).to_a.freeze
NUMS = Array(2..9).freeze
Run Code Online (Sandbox Code Playgroud) 我试图了解python中的splat-operators。我有一个代码:
word = ['s', 't', 'a', 'c', 'k', 'o', 'v', 'e', 'r', 'f', 'l', 'o', 'w']
print(*word)
Run Code Online (Sandbox Code Playgroud)
输出:
s t a c k o v e r f l o w
Run Code Online (Sandbox Code Playgroud)
我无法分配*word给某个变量来检查其类型或在调试中进行其他操作。因此,我比较讨厌哪种方式print()获取序列,*word以及是否有可能在不带空格的情况下打印此单词。理想的输出:
stackoverflow
Run Code Online (Sandbox Code Playgroud) 我想使用splat参数创建名为'add'和'subtract'的方法,如下所示:
def add(*numbers)
numbers.inject(0) { |sum, n| sum + n }
end
def subtract(*numbers)
numbers[0] - add(numbers[1..-1])
end
Run Code Online (Sandbox Code Playgroud)
但它没有用.我该怎么做才能将splat参数从一个传递给另一个?(特别是对于某些特定范围...)
谢谢!
我不明白这怎么行不通。该程序应该采用 Array 类中的第二个实例方法并返回数组中的第二个对象
class Array
def second(*arr)
arr.length <= 1 ? nil : arr[1]
end
end
#Test cases
Test.assert_equals(Array([1, 2, 3]), 2,) #Getting nil
Test.assert_equals(Array([]), nil) #passes
Test.assert_equals(Array([1]), nil) #passes
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如果我删除类数组并在第二个测试它工作正常吗?
我刚刚遇到了这个示例,其中splat运算符在方法定义中单独使用:
def print_pair(a,b,*)
puts "#{a} and #{b}"
end
print_pair(1,2,3,:cake,7)
#=> 1 and 2
Run Code Online (Sandbox Code Playgroud)
很明显你会在这样的上下文中使用它的原因和原因如下:
def arguments_and_opts(*args, opts)
puts "arguments: #{args} options: #{opts}"
end
arguments_and_opts(1,2,3, a: 5)
#=> arguments: [1, 2, 3] options: {:a=>5}
Run Code Online (Sandbox Code Playgroud)
但是为什么以及如何在第一个例子中使用它呢?既然在Ruby规范中定义了它必须有一个用例吗?
为什么以下工作:
Get-WmiObject -class Win32_OperatingSystem
Run Code Online (Sandbox Code Playgroud)
这也有效:
$params = @{class='Win32_OperatingSystem'}
Get-WmiObject @params
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
Get-WmiObject @{class='Win32_OperatingSystem'}
Run Code Online (Sandbox Code Playgroud)
错误:
Get-WmiObject : Invalid query "select * from System.Collections.Hashtable"
At line:1 char:1
+ Get-WmiObject @{class='Win32_OperatingSystem'}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Run Code Online (Sandbox Code Playgroud) 我有一个哈希,我想从中获取特定的密钥
a={1=>32, 23=>23, 24=>232, 56=>123}
keys=[23,56]
Run Code Online (Sandbox Code Playgroud)
为了从a {}获取此键的值,我正在使用function
a.values_at 23,56 # => [23, 232]`
Run Code Online (Sandbox Code Playgroud)
问题是我如何转换[23,56....]为23,56
splat ×10
ruby ×7
arrays ×3
c# ×1
class ×1
constants ×1
constructor ×1
freeze ×1
parameters ×1
powershell ×1
python ×1
reactiveui ×1
rubocop ×1
ruby-1.9.3 ×1