我对语言设计有点迷茫,我现在正在玩自己的爱好语言.(http://rogeralsing.com/2010/04/14/playing-with-plastic/)
让我头脑流血的一件事是"生成器"和"yield"关键字.我知道C#使用AST转换将枚举器方法转换为状态机.
但它在其他语言中如何运作?有没有办法在没有AST转换的语言中获得生成器支持?例如,像Python或Ruby这样的语言是否采用AST转换来解决这个问题?
(问题是如何在不同语言的引擎下实现生成器,而不是如何在其中一个中编写生成器)
在记录类型方面,有没有办法处理F#中的多态?
举一个例子,假设我们有两种记录类型的地址,街道地址和方框地址.我认为,当涉及到行为时,可以在模式匹配中处理它们.但是引用怎么样,有没有办法从其他记录中引用(不是对象引用)两种类型
如果输入数据损坏,有没有办法处理SQL强制转换?
假设我有一个数据类型列,NVarchar(10)并希望将此列转换为int.
我们还说有些nvarchar值已损坏,因此无法转换为int.
有没有办法默默地忽略这些,默认它们为0或某些这样的?
async等待演员内部的支持
我将演员lib Akka移植到.NET(https://github.com/rogeralsing/Pigeon)我想在我的演员中添加async/await支持.
这给了我一些问题,因为如果我使用默认调度程序,await continuation将运行与actor并发boundarys相关.这意味着,当actor处理消息时,可以继续运行,因为这将导致两个线程同时访问actor内部状态.
如果我能以某种方式将任务安排到演员自己的邮箱,并在邮箱运行中完成任务,这将解决问题.
public class SomeActor : UntypedActor
{
protected override OnReceive(object message)
{
if (message is SomeMessage)
{
DoAsyncStuff();
}
}
private async void DoAsyncStuff()
{
var res = await something..
//this code will not respect the actor concurrency boundary
//since it can run at the same time as OnReceive
Console.WriteLine(res);
}
}
Run Code Online (Sandbox Code Playgroud)
我确实有一个actor的线程静态上下文,所以当actor执行时,这个上下文被设置.所以我可以轻松地从任务调度程序中查找活动的actor邮箱.有点像:
public class ActorTaskScheduler : TaskScheduler
{
protected override void QueueTask(Task task)
{
var self = ActorCell.Current.Self; …Run Code Online (Sandbox Code Playgroud) c# concurrency multithreading task-parallel-library async-await
我无法理解为什么会这样:
1..1000 |> Stream.map(&(3 * &1)) |> Enum.sum
Run Code Online (Sandbox Code Playgroud)
虽然这没有:
1..1000 |> Stream.map (&(3 * &1)) |> Enum.sum
Run Code Online (Sandbox Code Playgroud)
唯一的区别是空间经过.map
我的理解,Elixir在这种情况下不应该关心白空间.
运行上面的代码会iex产生以下错误:
warning: you are piping into a function call without parentheses, which may be ambiguous. Please wrap the function you are piping into in parentheses. For example:
foo 1 |> bar 2 |> baz 3
Should be written as:
** (FunctionClauseError) no function clause matching in Enumerable.Function.reduce/3
foo(1) |> bar(2) |> baz(3)
(elixir) lib/enum.ex:2776: Enumerable.Function.reduce(#Function<6.54118792/1 in :erl_eval.expr/5>, {:cont, …Run Code Online (Sandbox Code Playgroud) 来自OOP背景,我在函数式编程中遇到了不可变对象/记录/消息概念的一些问题.
假设我通过一系列函数传递PurchaseOrder记录,其中每个函数应该添加或更新此记录中的数据.
在处理可变状态时,我只需设置传递消息的一些特定属性.
在处理不可变记录时,是否有一些设计技巧使事情变得更容易?复制每个字段以便只改变一个字段只是一种痛苦.
{ A = x.A ; B = x.B ; C = x.C ; D = x.D ; E = somethingnew; }
Run Code Online (Sandbox Code Playgroud)
我想尽可能地对数据进行分组是一种处理它的好方法,从而避免复制所有字段.对此还有其他方法或设计指南吗?
如何从KnockoutJS foreach中的函数绑定数据?
例如,我有以下代码:
<div data-bind="foreach: timeEntries">
<a href="#page1" data-icon="refresh" data-theme="c">
<span data-bind="text: getActivityName(ActivityId)"></span>
</a>
Run Code Online (Sandbox Code Playgroud)
我想调用模型上下文中存在的函数getActivityName,并传递ActivityId,它是foreach迭代的timeEntry上的属性.
只是绑定这个
data-bind="text: ActivityId"
Run Code Online (Sandbox Code Playgroud)
将正确显示每行的活动ID,但我需要进行查找并从字典中获取名称.我确实得到上面的代码最有可能调用当前项目的getactivityname而不是上下文,所以我该如何解决它?
在我的网站上,所有页面上都显示同一个Disqus线程.
我试过了:
var currentPageId = '/testo';
window.disqus_shortname = 'strengthtracker';
window.disqus_identifier = currentPageId;
window.disqus_url = 'http://strengthtracker.apphb.com/' + currentPageId;
Run Code Online (Sandbox Code Playgroud)
和:
var currentPageId = '/testo';
var disqus_shortname = 'strengthtracker';
var disqus_identifier = currentPageId;
var disqus_url = 'http://strengthtracker.apphb.com/' + currentPageId;
Run Code Online (Sandbox Code Playgroud)
两者结果相同,即使currentPageId发生变化,同一个线程也会出现在任何地方.
我在这做错了什么?
如果我想公开一个API,它在内部调度一系列应由用户取消的任务.例如
public ??? DoWork()
{
Task t = new .... , myCancellationToken);
return ???
}
Run Code Online (Sandbox Code Playgroud)
取消控制返回的正确对象是什么?是CancellationTokenSource吗?
public CancellationTokenSource DoWork()
{
CancellationTokenSource source = new ....
Task t = new .... , source.Token);
return source;
}
Run Code Online (Sandbox Code Playgroud)
我应该退还任何东西吗?我应该只接受CancellationToken作为arg并让用户在需要时创建令牌源吗?
public void DoWork(CancellationToken token)
{
Task t = new .... , token);
}
Run Code Online (Sandbox Code Playgroud)
处理这个问题最常用的方法是什么?
我正在尝试向我的应用程序前端VueJS后端Asp.NET core 2.1添加身份验证,但最终却无法使它真正进行身份验证。
在Asp.NET中设置身份验证:
var key = Encoding.ASCII.GetBytes("mysecret");
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
var userId = int.Parse(context.Principal.Identity.Name);
var user = userService.GetById(userId);
if (user == null)
{
// return unauthorized if user no longer exists
context.Fail("Unauthorized");
}
return Task.CompletedTask;
}
};
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key), …Run Code Online (Sandbox Code Playgroud) async-await ×2
c# ×2
f# ×2
.net ×1
asp.net ×1
casting ×1
concurrency ×1
disqus ×1
dsl ×1
elixir ×1
generator ×1
immutability ×1
knockout.js ×1
multimethod ×1
polymorphism ×1
records ×1
sql-server ×1
syntax ×1
t-sql ×1
yield ×1